可见性:
锁不仅仅是关于同步和互斥,也是关于内存可见的,为了保证线程能看到共享,变量的最新值,读取和写入线程都必须使用公共的锁进行同步
volatile变量:它确保对一个变量的更新和可预见的方式告诉其他线程,被声明的变量在运行时会被监视,它是共享的,所以读取一个volatile类型的变量,会返回某个线程写入的最新值.访问这个变量不会加锁,不会引起阻塞
只又当volatile变量能够简化实现和同步策略验证是才使用它,比如他所应用的对象状态的可见性,或者标识重要的生命周期事件
加锁可以保证可见性和原子性,volatile变量只能保证可见性
volatile满足什么条件才能使用?
写入变量时不依赖变量的当前值,或者确保只有单一的线程修改变量的值
变量不需要与其他的状态变量共同参与不变约束
而且访问变量时,没有其他的原因需要加锁
如果有变量需要全局共享,则可用用ThreadLocal类型保证线程安全。
不可变的对象永远都是线程安全的。
变量创建后不会被修改,所有域都是final类型的并且创建期间没有发生this引用的逸出
Hasttable,synchronizedMap,ConcurrentMap从MAP获取任意线程
vectorCopyOnWriteArrayList,CopyOnWriteArraySet,SynchronizedList,SyschronizedSet可以从容器中获取他的任意线程
BlockingQueue或者ConcurrentLinkedQueue可以从队列安全发布