对象锁与类锁

不同锁互不影响,共用一个锁,可能会发生阻塞。

1.在修饰静态方法时,锁定的是当前类的 Class 对象,在下面的例子中就是SycTest1.class

 2.当修饰非静态方法时,锁定的就是 this 对象,即当前的实例化对象

public class SyncTest1 {// synchronized修饰非静态方法public synchronized void test1() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " : " + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}// synchronized修饰this对象,即当前的实例化对象public void test2() {synchronized (this) {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " : " + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {SyncTest1 t1 = new SyncTest1();new Thread(new Runnable() {@Overridepublic void run() {t1.test1();}}, "thread1").start();new Thread(new Runnable() {@Overridepublic void run() {t1.test2();}}, "thread2").start();}
}
thread1 : 0
thread1 : 1
thread1 : 2
thread1 : 3
thread1 : 4
thread2 : 0
thread2 : 1
thread2 : 2
thread2 : 3
thread2 : 4

通过上面代码中可以看到,在test1里修饰的是非静态方法,即锁定的为当前实例化对象,即对象锁,test2锁定的就是this对象,也是对象锁,也就是thread1和thread2请求的是同一把锁,所以是Thread1运行完之后Thread2才运行。 

public class SyncTest1 {// 修饰静态方法public static synchronized void test1() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " : " + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}// 修饰类对象public void test2() {synchronized (SyncTest1.class) {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " : " + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {SyncTest1 t1 = new SyncTest1();new Thread(new Runnable() {@Overridepublic void run() {SyncTest1.test1();}}, "thread1").start();new Thread(new Runnable() {@Overridepublic void run() {t1.test2();}}, "thread2").start();}
}
thread1 : 0
thread1 : 1
thread1 : 2
thread1 : 3
thread1 : 4
thread2 : 0
thread2 : 1
thread2 : 2
thread2 : 3
thread2 : 4

通过上面代码中可以看到,在test1里修饰的是静态方法,即锁定的为当前的类对象,即类锁,而test2锁定的SyncTest1.class,也是类锁,也就是thread1和thread2请求的是同一把锁,所以是Thread1运行完之后Thread2才运行。  

public class SyncTest1 {// 修饰静态方法public static synchronized void test1() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " : " + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}// 修饰非静态方法public synchronized void test2() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " : " + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {SyncTest1 t1 = new SyncTest1();new Thread(new Runnable() {@Overridepublic void run() {SyncTest1.test1();}}, "thread1").start();new Thread(new Runnable() {@Overridepublic void run() {t1.test2();}}, "thread2").start();}
}
thread1 : 0
thread2 : 0
thread1 : 1
thread2 : 1
thread2 : 2
thread1 : 2
thread2 : 3
thread1 : 3
thread2 : 4
thread1 : 4

通过上面代码中可以看到,在test1里修饰的是静态方法,即锁定的为当前的类对象,即类锁,而test2锁定的非静态方法,也就是对象锁,也就是thread1和thread2请求的不是同一把锁,所以他们是两个锁,互不影响。

对象锁与类锁的区别:

对象锁和类锁其实本质上都是一种锁,区别在于一个类可以有多个对象锁,但类锁只有一个。 故使用 synchronized 对类加锁是唯一的,当一个线程拿到类锁,其他线程在执行到任何需要类锁的方法时都将阻塞。 总体来说类锁具有唯一性。

类的实例化对象可以有多个,对每个实例化对象加锁是互不干扰的,它们不具备全局唯一性,这里我们称它为对象锁。
对象锁一般可以用于细粒度锁的创建。

借鉴:Java并发编程-类锁与对象锁剖析 - 掘金 

synchronized的对象锁和类锁的区别 - 掘金

近日总结:感冒了......emo......


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505890.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现计算机类考研交流平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现计算机类考研交流平台系统演示 摘要 高校的大学生考研是继高校的高等教育更上一层的表现形式&#xff0c;教育的发展是我们社会的根本&#xff0c;那么信息技术的发展又是改变我们生活的重要因素&#xff0c;生活当中各种各样的场景都存在着信息技术的发展。…

chrome选项页面options page配置

options 页面用以定制Chrome浏览器扩展程序的运行参数。 通过Chrome 浏览器的“工具 ->更多工具->扩展程序”&#xff0c;打开chrome://extensions页面&#xff0c;可以看到有的Google Chrome扩展程序有“选项Options”链接&#xff0c;如下图所示。单击“选项Options”…

如何使用数据可视化库 D3 绘制折线统计图

如题&#xff0c;如何使用数据可视化库 D3 绘制折线统计图&#xff1f; 这篇文章将通过实例来讲解如何一步一步绘制下面这样一个折线统计图&#xff0c;并带有鼠标悬浮移动的文字显示效果。 首先&#xff0c;我们来看下什么是 d3&#xff1f;移步官网&#xff1a;https://d3js.…

Apple Mobile Device Driver

Apple Mobile Device Driver (Windows 10)原来安装过&#xff0c;突然不见了&#xff0c;可以尝试一下方法。 下载 Windows 版 iTunes - 官方 Apple 支持 (中国)

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、开始闯关 原理&#xff1a;在评论的时候提交可以提交到管理员列表去&#xff0c;管理员一看cookie和地址就被盗走了 点进去软件后会发现提交按钮 随便提交一下看看 放到div标签里面是不是有可能可以做&#xff0c;看看后台吧 那…

详解如何保证消息队列不丢失消息(以kafka为例)

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 一、引言 二. 持久化存储 2.1持久化存储原理&#xff1a; 2.2使用示例&#xff1a; …

【tableau学习笔记】tableau无法连接数据源

【tableau学习笔记】tableau无法连接数据源 背景&#xff1a; 学校讲到Tableau&#xff0c;兴奋下载Kaggle Excel&#xff0c;一看后缀CSV&#xff0c;导入Tableau发现报错“tableau无法连接数据源”&#xff0c;自作聪明改为后缀XLSX&#xff0c;bug依旧。 省流&#xff1a…

.idea文件详解

.idea文件的作用&#xff1a; .idea文件夹是存储IntelliJ IDEA项目的配置信息&#xff0c;主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。一般用git做版本控制的时候会把.idea文件夹排除&#xff0c;因为这个文件下保存的…

win11 更多网络适配器选项

win11更多网络适配器选项查找路径&#xff1a;控制面板→网络和共享中心→更改适配器设置

[技巧]Arcgis之图斑四至点批量计算

前言 上一篇介绍了arcgis之图斑四至范围计算&#xff0c;这里介绍的图斑四至点的计算及获取&#xff0c;两者之间还是有差异的。 [技巧]Arcgis之图斑四至范围计算 这里说的四至点指的是图斑最东、最西、最南、最北的四个地理位置点坐标&#xff0c;如下图&#xff1a; 四至点…

利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例

利用小蜜蜂AI智能问答ChatGPTAI高清绘图生成图文故事案例 这段时间利用小蜜蜂AI网站做了一些编程、绘图以及数据分析方面的案例。再过几个月&#xff0c;我的大孙子就要出生了。我要用小蜜蜂AI智能问答和AI高清绘图为大孙子生成一个1-9的数字图文故事。 小蜜蜂AI网站可以扫如…

Linux内存管理机制和虚拟内存技术

Linux内存管理机制和虚拟内存技术 1. 物理内存1.1 物理内存架构1.1.1 UMA内存架构1.1.2 NUMA内存架构 1.2 分页机制1.3 物理内存模型1.3.1 FLATMEM 平坦内存模型1.3.2 DISCONTIGMEM 非连续内存模型1.3.3 SPARSEMEM 稀疏内存模型 2. 虚拟内存2.1 分页机制2.2 多级页表2.3 内核态…