可见性
一个线程对共享变量的修改 能够被其他线程看到
共享数据的访问权限都必须定义为private
——————————————————————————————————————
---工作内存1(拷贝x的副本)--线程1
主内存(共享变量x存放)
---工作内存2(拷贝x的副本)--线程2
——————————————————————————————————————
synchronize实现可见性、原子性(同步)
获得互斥锁
清空工作内存
从主内存拷贝最新副本到工作内存
执行代码
将更改后的共享变量刷新到主内存
释放互斥锁
减少synchronize的粒度(控制范围越小越好)可提高线程安全的性能
volatile实现可见性 不保证原子性(如n++不是原子操作)
变量每次被线程访问时,都被迫从主内存中读取最新的值,变量发生变化,强迫线程将改后的值
刷新到主内存
while(Thread.activeCount()>1) {
Thread.yield();
}//主线程等待其他线程执行完再执行
ReentrantLock用法(保证自增操作的原子性)也可使用AtomicInterger
private Lock lock=ReentrantLock();
public void addA() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// synchronized(this) {
// this.a++;
// }
lock.lock();
try {
this.a++;
} finally {
lock.unlock();
}
}
volatile不需要加锁,不会阻塞线程
final也可以保证内存可见性(修饰的变量一旦赋值不可更改)