Java多线程之 对同一个值操作

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);

    }
}

 

posted @ 2020-09-08 15:48  PEAR2020  阅读(1131)  评论(0编辑  收藏  举报