一.什么时候用volatile
基本上,如果一个域可能被多个任务同时访问,并且这些任务中至少有一个是写入任务,那么就应该将这个域设置为volatile的。如果你将一个域定义为volatile的,那么它就会告诉编译器不要执行任何移除读取和写入操作的优化,这些操作的目的是用线程中的局部变量维护对这个域的精确同步。针对volatile关键字修饰的域,读取和写入都是直接针对内存的,并没有被缓存。但是,volatile并不能对递增进行原子操作。
二.原子操作
如果需要原子性的更新操作,可以使用AtomicInteger,AtomicLong等特殊的原子性变量类。只有在特殊情况下会用到这种类库,常用的就是计数了。通常使用锁会更安全一些,要么是synchronized,要么是Lock对象
三.临界区(同步块)
针对防止多线程同时访问方法内部的部分代码而不是整个方法时会用到同步块。这种分离的方式被称为临界区。使用synchronized锁住一个对象,此对象的锁用来对花括号内的代码进行同步控制。
synchronized(syncObject){
//synchronized code
}
在进入同步块代码之前必须获得同步对象的锁,否则需要在等待锁释放之后获得锁才可以进入同步块代码。
使用同步块的好处是,可以使多个人问访问对象的时间性能得到显著提高。
//TODO demo