为了证明前面讲述的线程锁住的是对象,看下面的例子:
定义线程类:
运行类:
运行结果:
修改方法为同步方法:
运行结果:
通过上面的实验得到结论,调用synchronized声明的方法一定是排队运行的,另外需要牢牢记住共享这两个字,只有共享资源的读写访问才需要同步化,如果不是共享资源,那么根本就没有同步的必要。
那么其它的方法在被调用时会是什么效果呢?看下面的例子:
定义线程类:
运行类:
运行结果:
通过上面的实验可知,虽然线程A先持有了object对象的锁,但是线程b完全可以异步调用非同步方法。
继续实验,将methosB改为同步方法,
现在变成了两个线程访问同一个对象的两个同步方法,运行结果:
此实验的结论是:
1)A线程先持有了Object对象的Lock锁,B线程可以以异步的方式调用object对象的非同步方法。
2)A线程先持有object对象的Lock锁,B线程如果在这时调用object对象的另一个同步方法,则需要等待,也就是同一个对象的两个同步方法在整体上也是同步的。