参考自:Java多线程编程核心技术_高洪岩(第二章)
1.当A线程调用anyObject对象加入synchronized关键字的X方法时,A线程就获得了X方法锁,也就是获得了对象锁,如果B线程调用anyObject对象中的其他非synchronized关键字修饰的Y方法时,是可以直接调用的;
当A线程调用anyObject对象加入synchronized关键字的X方法时,A线程就获得了对象锁,此时,如果B线程调用anyObject对象中的synchronized关键字修饰的Y方法时,就需要等待X方法执行完,再执行Y方法。
2.synchronized具有可重入锁的功能,也就是当该A线程获取了某个对象锁,该对象锁尚未释放时,还可以获得该对象锁。“可重入锁”在父子继承中也是可行的。
3.当方法抛出异常时,对象锁自动释放;另外,同步不具有继承性。
4.synchronized static和synchronized(类.class)的作用一样的,都是类锁,是对类进行同步。而synchronized 方法是对象锁。
5.volatile和synchronized的区别
1)volatile使数据具有可见性,即强制对象从公共栈而非私有栈中取数据,以保证获得的数据为最新,但是不能保证原子性(从下图1-->下图2)。synchronized既能保证原子性也能保证可见性。前者主要解决了变量在多个线程间的可见性,后者解决了多个线程间访问资源同步性问题。
2)volatile是线程同步的轻量级实现,性能较synchronized好。
3)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。
6.i++不是一个原子性操作,其主要包括三个过程,从内存中读取i值、对i值进行操作、将i值保存到内存中。
7.变量在内存中工作的过程,如下图所示: