Java并发学习笔记(9)组合对象的安全同步
2014-07-17 00:00
211 查看
大多数类都是由其他类组合起来的。所以组合后的类是否是同步安全的有时候会让人很迷惑。
(1)设计线程安全的类
a) 确定对象状态由哪些变量构成
b) 确定限制状态变量的不变约束
c) 制定管理并发访问对象状态的策略.
(2)数据限制为private,访问对象的方法设置为同步的可以有效的确保线程安全,且不要将数据发布到其他非线程安全的类中.发布到期望可用的范围内.
(3)Java监视器模式保护对象,其实就是将对象数据私有化,set,get方法同步化.
(4)一般情况来说,一个由线程安全的组件(类)组成的类,就是线程安全的.
(5)一般来说检查再运行的方式,并且并未使用同步,那是不安全不可取的方式.即便是检查的对象是线程安全的.两个线程安全的对象在非线程安全的对象中检查-运行,是不安全的.
如果组合后,一个状态集(对象中的对象)需要发布到公共的域中,那么其他方法使用这个集中的方法一定要在这个集上加锁,避免两个线程使用集的锁非同一锁.如下:
你不知道其他线程是否会直接使用lis 即使看上去put方法是同步了,但是如果直接使用lis使用的是list的锁而put使用的是B对象的锁.可以改成
如此就同步使用了list的锁;其实么.大家都会选择隐藏掉list,一般不会发布list这种做法一但发布list就必须使用第二种方式,
(1)设计线程安全的类
a) 确定对象状态由哪些变量构成
b) 确定限制状态变量的不变约束
c) 制定管理并发访问对象状态的策略.
(2)数据限制为private,访问对象的方法设置为同步的可以有效的确保线程安全,且不要将数据发布到其他非线程安全的类中.发布到期望可用的范围内.
(3)Java监视器模式保护对象,其实就是将对象数据私有化,set,get方法同步化.
(4)一般情况来说,一个由线程安全的组件(类)组成的类,就是线程安全的.
(5)一般来说检查再运行的方式,并且并未使用同步,那是不安全不可取的方式.即便是检查的对象是线程安全的.两个线程安全的对象在非线程安全的对象中检查-运行,是不安全的.
如果组合后,一个状态集(对象中的对象)需要发布到公共的域中,那么其他方法使用这个集中的方法一定要在这个集上加锁,避免两个线程使用集的锁非同一锁.如下:
class B{ public static List lis=Collections.synchronizedList(new ArrayList()); public synchronized void put(String s){ lis.add(s); }
}
你不知道其他线程是否会直接使用lis 即使看上去put方法是同步了,但是如果直接使用lis使用的是list的锁而put使用的是B对象的锁.可以改成
class B{ public static List lis=Collections.synchronizedList(new ArrayList()); public synchronized void put(String s){ synchronized(lis){ lis.add(s); } } }
如此就同步使用了list的锁;其实么.大家都会选择隐藏掉list,一般不会发布list这种做法一但发布list就必须使用第二种方式,
相关文章推荐
- java并发编程之组合对象学习笔记
- Java并发编程学习——《Java Concurrency in Practice》学习笔记 4.对象的组合
- java并发学习笔记(二) 测试synchronized锁住对象的范围
- Java并发读书学习笔记(十一)——原子变量与非阻塞同步机制
- Java并发学习笔记(7)线程的同步 (锁)
- Java并发系列(三)线程安全与对象的组合
- Java学习笔记—多线程(同步容器和并发容器)
- JAVA并发编程学习笔记------对象的可见性及发布逸出
- Java并发编程学习——《Java Concurrency in Practice》学习笔记 3.对象的共享
- 学习JAVA多线程编程 --- 《JAVA多线程编程核心技术》第2章 对象及变量的并发访问 笔记
- 【安全牛学习笔记】 安装Java、安装显卡驱动、安装网卡补丁、并发线程限制、电源优化.txt
- Java并发编程学习——对象的组合
- Java多线程学习笔记—从Map开始说说同步和并发
- (35)21.3.6 在其它对象上同步---Java编程思想之并发笔记
- java学习笔记:引用与对象(1)
- 孙鑫VC学习笔记:第十六讲 (一) 利用事件对象实现线程间的同步
- Java 对象的 toString() 方法 -Java 学习笔记 (16)
- java学习笔记2:对象的"引用"之二
- Java对象序列化学习笔记