java并发编程实践

java并发编程实践

ID:1356989

大小:648.08 KB

页数:40页

时间:2017-11-10

java并发编程实践_第1页
java并发编程实践_第2页
java并发编程实践_第3页
java并发编程实践_第4页
java并发编程实践_第5页
资源描述:

《java并发编程实践》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、1对象的共享关键字synchronized不仅能实现原子性还能确保当一个线程修改了对象状态后,另一个线程就可以看到对象状态的变化(内存可见性)1.1可见性重排序:在缺乏足够同步的多线程程序中,代码的执行顺序不会按照程序员写好的顺序进行。这是因为Java内存模型允许编译器、CPU对操作的执行顺序进行调整。1.1.1失效数据在多线程程序中,get方法、set方法都需要进行同步。这是因为get方法在获取变量时可能会获得一个失效的值,这个失效的值就是之前某个线程设置的。虽然已经失效但这个值曾经是正确的。1.1.2非原子的64位操作Java内存模型要求,非volatile类型的64位数值变量(d

2、ouble和long),JVM允许将64位的读操作和写操作分解为两个32位的操作。那么在多线程的环境中,如果要读取非volatile类型的double、隆就有可能会读取到某个值的高32位和另一个值的低32位组成的一个数值。但目前各种平台的商用虚拟机几乎都把64位数据的读写操作作为原子操作来对待。1.1.3加锁与可见性加锁的含义不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步。同步代码块的锁就是方法调用所在的对象,静态synchronized方法以Class对象作为锁。synchronized可以用于实

3、例变量、对象引用、static方法、类名称字面常量。1.在某个对象实例内,synchronizedaMethod(){}40/40可以防止多个线程同时访问这个对象其他的synchronized方法(这个对象还有其他的synchronized方法,如果其中一个线程访问了其中一个synchronized方法,那么其他线程将不能访问此对象另外的synchronized方法)。但不同的对象实例间的synchronized方法是相互独立的,也就是说其他线程照样可以访问相同类的另一个对象实例的synchronized方法。1.synchronizedstaticaMethod(){}对这个类所有的

4、静态synchronized方法都会起作用,但不会对非静态的synchronized起作用。这是因为static方法属于类方法,他属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static方法所获取到的锁就是调用这个方法的对象所属的类,而非static方法获取到的锁就是当前调用这个方法的对象了。2.除了在方法上用synchronized关键字外,也可以在方法内部的某个区块中用synchronized表示只对这个区块中的资源进行同步访问,例如synchronized(this){/**区块**/}的作用域就是当前对象。1.1.1.1非static方法运行

5、结果是:chunk对象与chunk1对象锁互不干扰。chunk19chunk40/401.1.1.1对象引用结果与上面一样,也是chunk与chunk1互不干扰chunk19chunk1.1.1.2static方法注意这段代码中的chunk与chunk1是互不干扰的,因为他们一个是static一个是非static方法。执行结果是:chunk19chunk40/40这段代码中的chunk与chunk1就可以进行同步操作了。因为他们的锁是同一个锁,执行结果是:9chunkchunk11.1.1.1类名称字面常量让所有这个类下面的对象都同步的时候,也就是让所有这个类下面的对象共用同一把锁的时

6、候,我们可以在区块中锁定类常量的方式进行。例如:通过锁定lock对象,我们可以实现对这个类所有对象的同步。切记synchronized锁定的是对象,对象不同就不会同步。例如:40/40两个方法就不会同步一个锁定的是lock一个锁定的是类对象。1.1.1volatile变量volatile是比synchronized更轻量级的同步机制。volatile变量有两种特性,一种是保证此变量对所有线程可见。但volatile变量对所有线程不是立即可见的,每次使用volatile变量时都会将变量值从主内存中取到线程内存里,所以volatile变量在各个线程中是一致的。但volatile变量的运算不

7、能保证在并发的环境下仍然是安全的,这是因为Java里的运算不是原子操作。volatile的使用情况如下:l运算结果不依赖于变量的当前值,或者能够确保只有单一线程修改变量的值l变量不需要与其他的状态变量共同参与不变形约束例如:当需要检查某个状态标记以判断是否退出循环的时候可以考虑采用volatile,加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。volatile的第二种特性是禁止指令重排序。Java内存模型对vo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。