java 并发编程实践 有感

来源:互联网 发布:国网网络大学网址 编辑:程序博客网 时间:2024/06/05 18:14

网上一直说这个这本书翻译的不好。。 下午终于粗略看了一下 确实不好,  不过也难免 ,写书的人是什么层面的 翻译的又是什么层面的呢。 两个北京工业大学的本科生  ,虽然工作了些年岁 ,但是毕竟不是做学术的。           不过就算翻译的不怎样  也是可以看懂的。

 

对于之前被问的几个问题 在里面似乎找到了答案。

 

3种方法解决并发问题

1.不跨线程共享变量

2.使状态变量为不可变的

3.在任何访问状态变量的时候使用同步

 

如何设计一个线程安全的类。

共有三个方面需要注意

1.确定对象状态由哪些变量构成

2.确定限制状态变量的不变性

3.制定一个管理并发访问对象的状态策略

 

那么什么如何保证状态的不可变性?

1.状态不能在创建后在修改

2.所有域都是final的

3.被正确创建(无 this引用溢出)

 

一个对象的状态就是它的数据 ,存储在状态变量中,比如实例域或静态域,还有其附属于对象的域

 

那么问题又来了 什么叫this引用溢出呢

 

以下几个概念

 

对象发布:他可以被当前范围之外的代码所使用

 

逸出:  一个对象在尚未准备好的情况下就将他发布
 

这里就发生了逸出现象  private 类型的变量可以 被外界访问了。

 

对于双锁单例 中的问题 可以归结为 this 引用构造期逸出  也就是会发生返回不完整的对象的情况。

 

另外注意内部类的情况  在你发布一个非静态的内部类的时候那么对应的外部类实例也被发布了。这就会发生潜在的问题  。隐隐觉得 ConcurrentHashMap 中 HashEntry 被设置为 静态内部类 与这方面有关但是还没有相通。

 

另外 如何控制任务的取消与开始 如果只是为了执行单个线程

 

那么可以一直循环标志位 但是这样CPU 利用率很差 。

 

想提高利用率 可以考虑使用 WAIT NOTIFY 进行优化 。 具体策略不写了 心中已有蓝图。

 

 

jvm 编译期对锁的优化

1.逸出分析   如果对象没有栈逸出的话那么没必要加锁

2.锁粗化  对几段相近的代码 进行锁粗化 减少获得锁的次数

 

 

还有更多内容 详读后整理 

 

 

 

 

原创粉丝点击