标签:
并发本身有两个概念:1.互斥性;2.可见性;
先来说一下可见性,就是让共享的变量在进程间可以及时获得最新版本的数据;这里比较简单的方式是为可能被并发修改的全局变量添加上volatile关键字;volatile关键作用根据我查找的用途,有两方面:
Volatile有他的局限性,比如对于i++这类多步骤处理,他就无法保证在取值和+1过程是原子的,所以这种情况下就需要互斥锁synchronize锁。
Synchronize锁需要注意一点,就是保证锁范围尽量少,尽快释放锁;在加锁的代码段尽量不要调用外部函数,因为外部函数不可控,还很容易引发死锁;
尽量多使用java内部封装的多线程工具,而不要使用wait-notify模式,但是如果是使用了,要保证wait是防止在while函数体里面,因为对于notify/notifyAll的调用你无法保证意图以及准确性;while函数体可以附加上条件检验;所以即使notify错了,因为附加条件不通过仍然会是等待线程处于等待状态;以及尽量少的直接使用Thread,而是使用Executor Framework封装的类以及Task对象;
不要使用Thread.yield以及线程池优先级;后者的作用仅仅是将控制权换回了线程调度器,后者不具备可移植性,如果发现了多线程问题尽量不要使用这两种方式。对于Thread.yield可以使用thread.sleep(1)来替代( 不要使用thread.sleep(0),它代表立即返回)。至于ThreadGroup就彻底放弃吧,没有什么意义的对象,而且还不保证线程安全性。
?
?
?
?
标签:
原文地址:http://www.cnblogs.com/xiashiwendao/p/4322510.html