download:SpringCloud Finchley三版本(M2+RELEASE+SR2)微服务实战
从零开端本人入手写自旋锁
我们在写并发程序的时分,一个十分常见的需求就是保证在某一个时辰只要一个线程执行某段代码,像这种代码叫做临界区,而通常保证一个时辰只要一个线程执行临界区的代码的办法就是锁🔒。在本篇文章当中我们将会认真剖析和学习自旋锁,所谓自旋锁就是经过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
}
}
版权声明:程序员胖胖胖虎阿 发表于 2022年11月24日 下午1:48。
转载请注明:SpringCloud Finchley三版本(M2+RELEASE+SR2)微服务实战 | 胖虎的工具箱-编程导航
转载请注明:SpringCloud Finchley三版本(M2+RELEASE+SR2)微服务实战 | 胖虎的工具箱-编程导航
相关文章
暂无评论...