package cn.bufanli.test;
/**
* 關鍵字 synchronized 關鍵字取得的鎖都是對象鎖,而不是一段代碼(方法) 當做鎖
* 所以代碼中哪個線程synchronized關鍵字的方法 哪個線程就持有該方法所屬對象的鎖(lock)
*多線程多個鎖:多個線程每個線程都可以拿到自己指定的鎖.分別獲得鎖之後,執行synchronized方法體的內
*容
* 在靜態方法上加synchronized 關鍵字,表示鎖定.class類 類一級別的鎖(獨佔.class類)
* 類級別的鎖:創建多個對象,多個對象持有的鎖是1把;
* 方法級別鎖,創建多個對象,多個對象各持有1把鎖
*/
public class MultiThread {
/**
* 變量上加static 關鍵字保證數據的原子性
*/
private static int num = 0;
/**
* 方法上加 static 是類鎖
* @param tag
*/
private synchronized void printNum(String tag){
try {
if(tag.equals("a")){
num = 100;
System.out.println("tag a ,set num over!");
Thread.sleep(1000);
}else{
num = 200;
System.out.println("tag b ,set num over!");
}
System.out.println("tag:" + tag + "num:" + num);
}catch (Exception e){
}
}
/**
* 注意主函數run方法的執行順序
* @param args
*/
public static void main(String[] args) {
//兩個不同的對象
MultiThread multiThread = new MultiThread();
MultiThread multiThread2 = new MultiThread();
Thread thread = new Thread(() -> {
multiThread.printNum("a");
});
Thread thread2 = new Thread(() -> {
multiThread2.printNum("b");
});
thread.start();
thread2.start();
/*Thread thread = new Thread(new Runnable() {
@Override
public void run(){
multiThread.printNum("a");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run(){
multiThread2.printNum("b");
}
});
thread.start();
thread2.start();*/
}
}