MyCAT+MySQL 搭建高可用企业级数据库集群内附材料文档
下载地址:百度网盘
从零开始自己动手写自旋锁
咱们在写并发程序的时候,一个非常常见的需要就是保障在某一个时刻只有一个线程执行某段代码,像这种代码叫做临界区,而通常保障一个时刻只有一个线程执行临界区的代码的方法就是锁🔒。在本篇文章当中咱们将会认真分析和学习自旋锁,所谓自旋锁就是通过 while 循环实现的,让拿到锁的线程进入临界区执行代码,让没有拿到锁的线程一直进行 while 死循环,这其实就是线程自己“旋”在 while 循环了,因而这种锁就叫做自旋锁。
原子性
在谈自旋锁之前就不得不谈原子性了。所谓原子性简略说来就是一个一个操作要么不做要么全做,全做的意义就是在操作的过程当中不能够被中断,比方说对变量 data 进行加一操作,有以下三个步骤:
将 data 从内存加载到寄存器。
将 data 这个值加一。
将失去的后果写回内存。
原子性就示意一个线程在进行加一操作的时候,不能够被其余线程中断,只有这个线程执行完这三个过程的时候其余线程才能够操作数据 data。
咱们现在用代码体验一下,在 Java 当中咱们可能使用 AtomicInteger 进行对整型数据的原子操作:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicDemo {
public static void main(String[] args) throws InterruptedException {
AtomicInteger data = new AtomicInteger();
data.set(0); // 将数据初始化位 0
Thread t1 = new Thread(() -> {for (int i = 0; i < 100000; i++) {data.addAndGet(1); // 对数据 data 进行原子加 1 操作
}
});
Thread t2 = new Thread(() -> {for (int i = 0; i < 100000; i++) {data.addAndGet(1);// 对数据 data 进行原子加 1 操作
}
});
// 启动两个线程
t1.start();
t2.start();
// 等待两个线程执行实现
t1.join();
t2.join();
// 打印最终的后果
System.out.println(data); // 200000
}
}