线程的同步

线程的同步使用关键synchronized。
synchronized可以修饰方法,也可以修饰块。

1. synchronized方法

synchronized方法控制”对象“的访问。每个对象都对应一把锁。每个synchronized方法,都必须获得调用该方法的对象的锁才能执行,否则线程将会阻塞。

2. synchronized块

synchronized(obj){}
其中,obj称之为同步监视器(即变化的对象)。

  • obj可以是任何对象,但是推荐使用共享对象作为同步监视器。
  • 同步方法中,无需指定同步监视器。因为同步方法的同步监视器就是this,就是这个对象本身,或者是class。
  • 注意:锁的对象是变化的量。

2.1 同步监视器的执行过程:

a、第一个线程访问,锁定同步监视器,执行其中代码。
b、第二个线程访问,发现同步监视器锁定,无法访问。便等待同步监视器解锁。
c、第一个线程访问完毕,解锁同步监视器。
d、第二个线程访问,发现同步监视器没有锁,然后锁定并访问执行代码。
其中在 java.util.concurrent包中已封装好同步方法,可直接使用。例如CopyOnWriteArrayList 就是封装好的线程安全的arrayList

上一篇:synchronized add-un


下一篇:多线程