带你搞懂Java多线程(三)

2020-01-03  本文已影响0人  爺珍爱那颗心

带你搞懂Java多线程(一)
带你搞懂Java多线程(二)

什么是线程间的共享

Java支持多个线程同时访问一个对象或一个对象里的成员变量。

线程间共享会存在的问题

public class Test{
    private Object obj = new Object();
    private int count = 0;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    private void add(){
        count++;
    }
}

private static class Count extends Thread{
    private Test test;

    public Count(Test test){
        this.test = test;
    }

    @Override
    public void run() {

        for (int i = 0; i < 1000; i++) {
            test.add();
        }
    }
}

public static void main(String[]args){
    Test test = new Test();
    Count countOne = new Count(test);
    Count countTwo = new Count(test);
    countOne.start();
    countTwo.start();
    Thread.sleep(100);
    System.out.println(test.count);
}

运行结果在1000~2000之间。

synchronized关键字

为了解决上面的问题Java语言内置了synchronized关键字,所以也叫内置锁。

//①锁的是当前对象
 private synchronized void add(){
        count++;
    }
//②锁的是指定对象
 private void add(){
        synchronized(obj){
        count++;
      }
    }
private static synchronized void add(){
  count++;
}

其实本质上还是对象锁,只不过类锁是由static关键字修饰的成员变量或方法上,虚拟机中只有一份。

上一篇 下一篇

猜你喜欢

热点阅读