博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程的通信和同步(Java并发编程的艺术--笔记)
阅读量:6954 次
发布时间:2019-06-27

本文共 1057 字,大约阅读时间需要 3 分钟。

1. 线程间的通信机制
线程之间通信机制有两种: 共享内存、消息传递。
 
2. Java并发
Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透明的。
 
3. 同步原语
有三个同步原语:Synchronized、volatile和final。
Synchronized 的主要的含义是对指定的对象、方法、类 进行加锁和解锁的操作。保证当前只有一个线程进行访问。
Volatile 的主要的含义是对指定的变量在数据的读取和更新时都从共享内存中进行操作,抛弃了本地内存,这样的话能够保证对数据的修改是对其他的线程可见的。
final 主要是限制了在编译的过程中的重排序,需要保证的是针对此数据的读操作必须要在初始化之后。
 
Volatile更适用于修饰变量,属于轻量级别的锁。
特点是:在修饰的变量值是控制了其写的锁,其他的线程还是能够读取数据的。
 
Synchronized 是一种稍微比较重量级的锁。 
Synchronized 中的每一个对象都可以作为锁。具体的表现形式如下:(锁都是对象)
1.  对于普通的同步方法,锁是当前对象实例
2.  对于静态同步方法,锁是当前类的class对象
3.  对于同步方法块,锁是Synchronized括号里配置的对象
 
双重检测锁定也需要注意适当的使用Synchronized、volatile这两个同步原语,如果不用这两个可能会导致线程在生成对象的时候可能因为编译时的重排序出现内容的错误。 相关文章: 
 
4. Java实现原子操作
Java中可以使用锁和循环CAS的方式来实现原子操作:
private void safeCount(){    for(;;) {        int i = atomicI.get();        boolean suc = atomicI.compareAndSet(i, i++);        if (suc) {            break;        }    }}
但是原子操作可能会有三大问题:
①.ABA问题
之前的Java原子操作存在的问题就是变量值的值改回来之后,不知道是否改变过,需要加版本控制。 但是在Java 1.5之后,此问题得到了解决,也就会说目前不存在ABA问题了
②.循环时间长开销大
如果执行的操作长时间执行不成功,会给CPU带来非常大的执行开销。
③.只能保证一个共享变量的原子操作
目前针对此问题的解决办法就是讲多个共享变量综合为一个。
 

转载地址:http://nbvil.baihongyu.com/

你可能感兴趣的文章
Alpine Linux配置使用技巧【一个只有5M的操作系统(转)】
查看>>
sqlcmd
查看>>
stl之multiset容器的应用
查看>>
LeetCode 205 Isomorphic Strings(同构的字符串)(string、vector、map)(*)
查看>>
Django REST Framework限速
查看>>
洪涝淹没分析输出淹没范围图、深度图及面积体积等信息【转】
查看>>
树莓派(Debian)系统开启iptables的raw表实现日志输出
查看>>
图像滤镜实现万能方法研究
查看>>
nginx-启动gzip、虚拟主机、请求转发、负载均衡
查看>>
magento 2.3安装测试数据
查看>>
大数据开发实战:数据平台大图和离线数据平台整体架构
查看>>
Git 收集别名
查看>>
操作系统日志分析中常见的搜索条目 20160715
查看>>
《CLR via C#》笔记——异常和状态管理
查看>>
将matlab的figure保存为pdf,避免图片太大缺失
查看>>
Spring MVC 3 深入总结
查看>>
原创4:dell sc1425老服务器安装vmware虚拟机esxi 5.0-更新Dell SCSI Hard Drive Firmware
查看>>
JAVA多线程学习Runnable接口
查看>>
AE Geoprocessor 实现 AnalysisTool Union功能
查看>>
深入理解JVM
查看>>