1. synchronized和volatile关键字
synchronized:可以修饰方法或以同步块方式使用,可以确保同一时刻只有一个线程处于方法或同步块中,用于实现锁。
volatile:轻量级synchronized,保证共享变量可见性:对该关键字修饰的变量访问需要从共享内存中获取;对他的改变必须同步回共享内存。
2. 原子操作
不能被中断的一个或一系列操作。java中通过锁和循环CAS(并发包中的原子操作类AtomicXXX)实现。
CAS存在的问题
1. ABA问题:在准备修改为新值前,另外两个线程已连续修改了两次变量的值,使得该值又恢复为旧值,这样的话,我们就无法正确判断这个变量是否已被修改过。解决方法:加时间戳或者版本号: AtomicStampedReference类,ES中文档具有版本号。
2. 循环时间长:CAS长时间多次未成功,CPU开销较大。
3. 多个共享变量操作:AtomicReference类使用引用对象存放多个变量进行CAS操作。
3. 线程通信与同步
线程通信:线程之间进行交换信息。
- 共享内存:不同线程通过读写内存中的公共状态进行隐式通信。
- 消息传递:不同线程直接互发消息显式通信。
线程同步:控制不同线程操作发生的相对顺序。
- 共享内存:程序显示指定某方法或代码在线程之间互斥执行。
- 消息传递:发送接收消息顺序执行,隐式进行同步。
JAVA采用共享内存方式进行通信和同步。
JAVA线程通信方式如下图所示:线程本地内存会保存主内存中共享变量的副本,线程对副本变量修改并更新回主内存后,其他线程就可以到主内存中获取更新后的共享变量并修改自己的本地变量,实现通信。

网友评论