1.深入synchronized关键字
线程间的通讯首要的方式就是对字段及其字段所引用的对象的共享访问。这种通信方式是及其高效的,但是也是导致了可能的错误:线程间相互干涉和内存一致性的问题。避免出现这两种错误的方法就是同步。
- 线程间相互干扰描述了当多个线程访问共享数据时可能出现的错误。
- 内存一致性错误描述的了共享内存可能导致的错误。
- 同步方法(Synchronized method)描述了一种简单的可以有效防止线程间相互干扰及其内存一致性错误的方法。
- 明锁及同步描述了一种更加通用的同步方法,以及同步是如何基于明锁而实现的。
- 原子性描述了不能被其它线程干扰的操作。
-
Java编程语言中提供了两种基本的同步用语:同步方法和同步语句。同步语句相对而言更为复杂一些,我们将在下一小节中进行描述。本节重点讨论同步方法。
-
我们只需要在声明方法的时候增加关键字synchronized即可:
- public class SynchronizedCounter {
- private int c = 0;
- public synchronized void increment() {
- c++;
- }
- public synchronized void decrement() {
- c--;
- }
- public synchronized int value() {
- return c;
- }
- }
同步语句
另外一种创建同步代码的方式就是使用同步语句。和同步方法不同,使用同步语句是必须指明是要使用哪个对象的内部锁:
- public void addName(String name) {
- synchronized(this) {
- lastName = name;
- nameCount++;
- }
- nameList.add(name);
- }