synchronized关键字的底层原理
synchronized关键字的底层原理
今天为网友们详解synchronized关键字的底层原理的相关话题,下面IT袋网为您详细介绍
在Java中,关键字synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作)。
同时我们还应该注意到synchronized的另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到
1. synchronized的基本使用
在现实场景中,抢票代码,如果不加锁,就会出现超卖或者一张票卖给多个人
Synchronized对象锁采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其它线程再想获取这个对象锁时就会阻塞住,代码如下
public class synchronizedTest {
// 创建一个静态对象作为锁
static Object lock = new Object();
// 初始票数
int ticketNum = 20;
// 获取票的方法,使用 synchronized 修饰确保线程安全
public synchronized void getTicket() {
// 使用当前对象作为锁
synchronized (this) {
// 如果票数已经为零,则返回
if (ticketNum <= 0) {
return;
}
System.out.println(Thread.currentThread().getName() + "抢到一张票,剩余:" + ticketNum);
// 非原子性操作,扣除一张票
ticketNum--;
}
}
public static void main(String[] args) {
// 创建 synchronizedTest 实例
synchronizedTest synchronizedTest = new synchronizedTest();
// 创建并启动 20 个线程
for (int i = 0; i < 20; i++) {
// 调用获取票的方法
new Thread(() -> synchronizedTest.getTicket()).start();
}
}
}
通过以上代码,加synchronized锁,就可以防止超卖
特别说明:synchronized 关键字的底层实现涉及到 Java 虚拟机中的监视器(Monitor)机制。
每个 Java 对象都与一个 Monitor 相关联,Monitor 负责对象的锁定和解锁,以及线程的阻塞和唤醒。
2. Monitor
Monitor 被翻译为监视器,是由jvm提供,c++语言实现
使用一下简单代码中查看monitor,通过javap命令查看clsss的字节码
public class MonitorTest {
static final Object lock = new Object();
static int counter = 0;
public static void main(String[] args) {
synchronized (lock) {
counter++;
}
}
}

- monitorenter: 上锁开始的地方
- monitorexit: 解锁的地方
- 其中被monitorenter和monitorexit包围住的指令就是上锁的代码
相关阅读
-
Git基础入门教程:从零开始掌握版本控制
你是不是想知道Git基础入门教程方面的介绍,一起来了解了解吧。 Git是一个分布式版本控制系统,它在软件开发中被广泛应用,用于跟踪和管理代码的版本更改。 无论你是开发人员,还是想学
-
做网页的素材有哪些 网页设计制作网站
关于做网页的素材有哪些和网页设计制作网站的电脑小知识,接下来分享详细内容。 很多小伙伴们在准备做网站的时候通常是先找网站建设公司洽谈需求然后再根据服务商的要求提供对应素材
-
mysql数据库基础知识是什么 数据库零基础入门教学
今日小编为你讲解mysql数据库基础知识是什么和数据库零基础入门教学IT技巧方面的经验,请看下面详细的介绍。 MYSQL数据库简介 1、数据库就是存储数据的仓库,其本质是一个文件系统。数据
-
什么是TCP/IP协议? TCP/IP协议包含哪几层?
跟大家聊一聊什么是TCP/IP协议的相关介绍,具体介绍如下: TCP/IP协议是Transmission Control Protocol/Internet Protocol的缩写,意为传输控制协议/因特网互联协议。 它是一种用于计算机网络通信的协议族


