1.3 加锁和可见性
当某线程执行由锁保护的同步代码块时,可以看到其他线程之前在同一同步代码块中的所有操作结果。如果没有同步,将无法实现上述保证。...从内存可见性来看:写入volatile变量相当于退出同步代码块,读取则相当于进入同步代码块(并不建议过度依赖此特性,通常比使用锁的代码还复杂)
仅当能简化代码的实现及对同步策略的验证时,才该用.若在验证正确性时需要复杂判断可见性...必须为volatile型.否则,当asleep被另一个线程修改时,执行判断的线程却发现不了.亦可使用加锁保证,但代码会很复杂....加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性
当且仅当满足以下所有条件时,才该用volatile变量
对变量的写入操作不依赖变量的当前值,或能确保只有单个线程更新变量的值...安全的共享对象
实用策略:
线程封闭 线程封闭的对象只能由一个线程拥有,对象被封闭在该线程中,并且只能由这个线程修改
只读共享 在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它