1)The code segments within a program that access the same object from separate, concurrent threads are called “critical sections”。这是临界区的概念。
2)同步的两种方式:同步块和同步方法。
3)每一个对象都有一个监视器,或者叫做锁。
当线程执行到synchronized的时候,检查传入的实参对象,并得到该对象的锁旗标。如果得不到,那么此线程就会被加入到一个与该对象的锁旗标相关联的等待线程池中,一直等到对象的锁旗标被归还,池中的等待线程就会得到该锁旗标,然后继续执行下去。当线程执行完成同步代码块,就会自动释放它占有的同步对象的锁旗标。一个用于synchronized语句中的对象称为监视器,当一个线程获得了synchronized(object)语句中的代码块的执行权,即意味着它锁定了监视器。
4)同步方法利用的是this所代表的对象的锁。
下面实例介绍代码块与方法间的同步。观察this的作用。
注2,如果使用synchronized (str),则两个线程不会同步。
5)要时刻考虑CPU会随时切换线程的情况。
6)同步是以牺牲程序的性能为代价的。
1.1同步代码块
ThreadDemo2.java
1.2同步方法
ThreadDemo3.java
2.线程的死锁
线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁。
track after start
MainThread enter A.foo
track in run
RacingThread enter B.bar
MainThread trying to call B.last
RacingThread trying to call A.last
3.参考资料
[1]Thinking in Java 3rd