1. 程式人生 > 其它 >JUC第一個筆記

JUC第一個筆記

技術標籤:筆記多執行緒java

JUC

一.執行緒和程序

程序:
一個程序包含多個執行緒,至少包含一個執行緒!
java預設有倆個執行緒,一個main主方法,還有一個GC垃圾回收。
執行緒:
一個程序就像一隻火車,一個執行緒就像一隻車廂,比如說一隻車廂著火了,會影響其他車廂,但是不會影響另一輛火車(程序之間沒有影響),同一個程序下之間資料容易完成資料共享,比如同一輛火車不同車廂之間。
併發:
cpu只有一核,快速切換,實現多執行緒,交替執行。
併發程式設計的本質:充分利用cpu資源
並行
cpu多核,不用快速切換,多個任務同時執行,一起行走。
執行緒有幾個狀態:

public enum
State { //新建 NEW, //執行 RUNNABLE, //阻塞 BLOCKED, //等待(一直死等) WAITING, //超時等待(有等待時間,過期不候) TIMED_WAITING, //終止 TERMINATED; }

wait和sleep的區別:
1.來自不同的類:
wait->object
sleep->Thread
2.鎖的釋放:
wait可以釋放鎖!
sleep抱著鎖頭睡覺,不會釋放!
3.適用範圍:
wait必須在同步程式碼塊中!
sleep可以在任何地方!

lock鎖:
synchronized 模擬搶票!

public class Test {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(
                new Runnable(){
                    @Override
                    public void run() {
                        for (int i=0;i<50;i++){
ticket.sale(); } } } ).start(); new Thread( new Runnable(){ @Override public void run() { for (int i=0;i<50;i++){ ticket.sale(); } } } ).start(); new Thread( new Runnable(){ @Override public void run() { for (int i=0;i<50;i++){ ticket.sale(); } } } ).start(); } } class Ticket{ private int number = 40; public synchronized void sale() { if (number > 0) { System.out.println("還剩" + (--number) + "張票!"); } } }

Lock鎖:
Lock介面
ReentrantLock:可重入鎖
三個步驟:
1.Lock lock = new ReentrantLock();
2.方法前加鎖lock.lock();
3.try cache finally{
lock.unlock()#解鎖
}

public class Test2 {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 40; i++) {
                    ticket.sale();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 40; i++) {
                    ticket.sale();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 40; i++) {
                    ticket.sale();
                }
            }
        }).start();
    }
}
class Ticket2{
    int number =40;
    //可重用鎖
    Lock lock = new ReentrantLock();
    public void sale(){
        lock.lock();
        try {
            if (number>0) {
                System.out.println("還剩" + (--number) + "張票");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}