Java并发编程实战笔记二(线程安全性)

2.1 线程安全性

    当多个线程访问某个类时,(不管运行时采用何种调度方式或者线程如何交替执行,主调代码中不需要任何额外的同步或协同)这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。

    线程安全性的根源在于多线程对共享变量的并发访问出现的:

  • “共享”意味着变量可以由多个线程同时访问,而“可变”则意味着变量的值在生命周期内可以发生变化
  • 一个对象是否需要是线程安全的,取决于它是否被多个线程访问
  • 当多个线程访问某个状态变量并且其中有一个线程执行写入操作时,必须采用同步机制来协同这些线程对变量的访问

    有三种方式可以修复这个问题:

  1. 不在线程之间共享该状态变量(线程内局部变量)
  2. 将状态变量修改为不可变的变量(final关键字)
  3. 在访问状态变量时使用同步(synchronized/lock)

也可以使用或设计不可变类来保证线程安全可参见: 不可变类的设计

三种方式代码示例:

1.局部变量

public int count() {
		int number = 0;
		for (int i = 0; i < 100; i++) {
			number++;
		}
		return number;
	}

2.共享变量-final关键字(final域必须为不可变对象)

public static final Integer ONE = 1;

如果在设计不可变类时,那么在构造方法或静态工厂方法时应初始化数据,不能对外提供设值方法。

3.同步锁(synchronized/lock)

synchronized(lock) {
	// 访问或修改由锁保护的共享变量	
}

 

你可能感兴趣的:(Java并发编程)