可将类的所有方法进行同步(使用synchronized)构建线程安全的类:
public class SynchronizedInteger {
private Integer value;
public synchronized Integer getValue() {
return this.value;
}
public synchronized void setValue(Integer value) {
this.value = value;
}
}
为何这样就是线程安全的类了呢?因为同步方法的锁是当前对象,而调用getter和setter的对象是同一个,也就是说此时在调用getter时无法调用setter,同样地,调用setter时无法调用getter,这样是实现了线程安全。但是将每个方法都同步也会带来性能问题,因为这样的话该对象在调用方法时必须等到之前调用的方法执行完毕并释放锁之后才能调用,也就是说该对象在一个时间段内只能执行一个方法。
同步方法在调用时遵循以下规则:
1、当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞
2、当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块
3、当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞