关于算法:BAT大牛亲授-个性化推荐算法实战内附资料文档

BAT大牛亲授 个性化举荐算法实战内附材料文档

下载地址:百度网盘
从零开始自己动手写自旋锁
咱们在写并发程序的时候,一个非常常见的需要就是保障在某一个时刻只有一个线程执行某段代码,像这种代码叫做临界区,而通常保障一个时刻只有一个线程执行临界区的代码的方法就是锁🔒。在本篇文章当中咱们将会认真分析和学习自旋锁,所谓自旋锁就是通过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

}
}

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据