一、线程的工作原理
jvm有唯一的main memory,每个线程有属于自己的working memory。当线程对variable操作时,从main memory中copy到自己的working memory,操作完成后将结果写回main memory。由于之间存在时间差,各个线程获取的variable可能不一样,从而导致了线程不安全。
二、线程安全的四种实现方法
线程安全依靠的是线程同步,实现线程同步有以下四种方法。
方法1:同步方法,使用synchronized修饰方法。调用该方法前需先获得内置锁,否则阻塞,锁住当前实例。若修饰静态方法,则锁住整个类,即锁住所有实例。public (static) synchronized void save(){ ... }
方法2:同步代码块,使用synchronized修饰代码块。
public (static) void save(){
synchronized(this) { ... }
}
方法3:使用特殊域变量volatile。private volatile int account = 100;
方法4:使用重入锁实现线程同步。
private Lock lock = new ReentrantLock();
public (static) save(){
lock.lock();
...
lock.unlock();
}