Java多线程编程核心技术学习(二)

参考自: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既能保证原子性也能保证可见性。前者主要解决了变量在多个线程间的可见性,后者解决了多个线程间访问资源同步性问题。

Java多线程编程核心技术学习(二)_第1张图片        Java多线程编程核心技术学习(二)_第2张图片

2)volatile是线程同步的轻量级实现,性能较synchronized好。

3)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。

6.i++不是一个原子性操作,其主要包括三个过程,从内存中读取i值、对i值进行操作、将i值保存到内存中。

7.变量在内存中工作的过程,如下图所示:

Java多线程编程核心技术学习(二)_第3张图片












你可能感兴趣的:(多线程)