可见性 一个线程对共享变量的修改 能够被其他线程看到 共享数据的访问权限都必须定义为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也可以保证内存可见性(修饰的变量一旦赋值不可更改)