文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/83a103889fd582375d3d4eb14409f5bc.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ade75a00b3b0750e4b82899f6b535df5.png)
一、volatile关键字-内存可见性
二、CAS算法
三、ConcurrentHashMap锁分段机制
四、CountDownLatch闭锁
五、Callable接口
与Runntable相似,只多了返回值,并且抛出了异常。
六、Lock同步锁
生产者消费者案例:
- 问题一:当满仓或缺货时,生产者或消费者没停下来。
解决:使用等待唤醒机制,当生产者进货成功,this.notifyAll()唤醒其他线程,当满仓时,this.wait()进入等待,当消费者消费成功,this.notifyAll()唤醒其他线程,当缺货时,this.wait()进入等待。 - 问题二:虚假唤醒
解决办法:使用while代替if判断,当被唤醒后while循环再次判断后,通过了再执行操作。
七、Condition控制线程通信
八、线程按序交替
public class TestABCAlternate {
public static void main(String[] args) {
ABCAlternate abc = new ABCAlternate();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
abc.loopA(i);
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
abc.loopB(i);
}
}
}, "B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
abc.loopC(i);
}
System.out.println("-----------------");
}
}, "C").start();
}
}
class ABCAlternate{
private static int number = 1; //标记,执行A,B,C
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
public void loopA(int totalLoop){
lock.lock(); //加锁
try {
if(number != 1){
condition1.await();
}
for (int i = 0; i < 2; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + totalLoop + "\t" + i);
}
number = 2;
condition2.signal(); //唤醒下一个
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock(); //释放锁
}
}
public void loopB(int totalLoop){
lock.lock(); //加锁
try {
if(number != 2){
condition2.await();
}
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + totalLoop + "\t" + i);
}
number = 3;
condition3.signal(); //唤醒下一个
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock(); //释放锁
}
}
public void loopC(int totalLoop){
lock.lock(); //加锁
try {
if(number != 3){
condition3.await();
}
for (int i = 0; i < 4; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + totalLoop + "\t" + i);
}
number = 1;
condition1.signal(); //唤醒下一个
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock(); //释放锁
}
}
}
九、ReadWriteLock 读写锁
十、线程八锁
十一、线程池
十二、ForkJoinPool 分支/合并框架 工作窃取