1.首先synchronized(對象 --> 一定是一個類,不可以用基本數據類型)
2.目標是對Integer count操作,用count當鎖有問題,因為count是包裝類型,存放的是地址,count不斷變化則地址不斷變化,對象不斷變化
所以使用Object o 當作鎖,因為不變化
3.如果不加while(true){} => 不能達到並發的效果
如果加while true + break => 線程輪流排隊拿鎖o
4. 此時syn代碼塊和syn方法起到相同效果
public class FourThread extends Thread{ private static Integer count = 0; private Object o = new Object(); static int a = 0; @Override public void run(){ while (true){ synchronized (o){ // 1.syn代碼塊 count++; System.out.println(Thread.currentThread().getName()+"===="+count); // 或者2. syn的add方法{count++},取代代碼塊 a++; break; } } } public static void main (String[] args) throws InterruptedException { for(int i=0;i<100;i++){ new FourThread().start(); } while(a<100){ Thread.sleep(100); } System.out.println("count="+count); } }