EffectiveJava读书笔记 第10章 并发

来源:互联网 发布:js中格式化日期为date 编辑:程序博客网 时间:2024/05/17 02:21

线程:允许多个活动。

第六十六条:同时访问共享的可变数据

关键字:synchronized, 保证同一个时刻,只有一个线程可以执行某一个方法,或者某一个代码块。

java的语言规范保证读取或者写一个变量是原子的,除非这个变量的类型是long或者double。换句话说:读取一个非long 和double类型的变量,可以保证返回的值是某个线程保存在该变量中的,即使多个线程在没有同步的情况下并发地修改这个变量也是如此。

为了在线程之间进行可靠的通信,也为了互斥访问,同步也是必要的。

java语言规范中“内存模型”,规定了一个线程所做的变化何时以及如何变成对其他线程可见。

不要使用Thread.stop()方法阻止一个线程妨碍另一个线程的任务。建议做法是:让第一个线程轮询poll一个boolean域,这个域默认为false。但是可以通过第二个线程设置为true,来表示第一个线程将终止自己。


问题在于:没有同步,就不能保证后台线程何时“看到”主线程对stopReuquested的值所做的改变。没有同步,虚拟机将代码:

转变成为:


这是可以接受的,这种优化称作提升。正是HopSpot Seved VM的工作。结果是个活性失败:这个程序无法前进。

修改的方法是:


这个时候,读方法:stopRequested()和写方法requestStop()都被同步了。

如果读写操作没有都被同步的话,同步是不会起作用的。


0 0
原创粉丝点击