参考书籍 <<java并发编程实战>>
1.java对并发问题的应对:
1.为了使多线程程序的行为可预见,访问共享变量必须经过合理的协调,这样线程才不会
相互干扰.所以java提供了同步机制来协调这样的访问
2.线程运行时仍然会带来一定程度上的开销:上下文切换(Context Switches),当调度程序
临时挂起当前运行的线程时,另一个程序开始运行---这在多线程组成的应用程序中是很频
繁的,并且带来巨大的性能开销:保存和恢复线程执行的上下文,离开执行现场,并且CPU的
时间会花费在对线程的调度,而不是在运行上.当线程共享数据时,它们必须适用同步机制,
这个机制会限制编译器的优化,能够清空或锁定内存和高速缓存,并在共享内存的总线上创
建同步通信,这就引入了新的性能开销.
2.线程安全的实质
线程实质是在不可控的并发访问中保护数据,这些数据代表了对象的状态.一个对象应该是线程
安全的取决于它是否被多个线程访问.线程安全这个性质,取决于程序如何使用对象,而不是对象
完成了什么.保证对象的线程安全性需使用同步来协调对其可变状态的访问.无论何时,只要有
多于一个的线程访问给定的状态变量,而且其中某个线程会写入该变量,此时必须使用同步来协
调线程对该变量的访问.java中的同步机制是sunchronized关键字,它是独占锁.除此之外,术语
"同步"还包括volatile变量,显式锁和原子变量的使用
3.多线程访问同一个变量时如何保证线程安全
a.不要跨线程共享变量
b.使状态变量为不可变
c.在任何访问状态变量的时候使用同步