1.5 synchronized类锁和对象锁快速区别
快速区别:
对象锁:
1、public synchronized void test2() {}
2、
public void test3() {//this指的就是我们new出来的实例,比如a,bsynchronized (this) {} }
类锁:
1、public static synchronized void test4() {}
2、
public void test5() {synchronized (TestSyn.class) {}
}
锁竞争执行结果快速区别
有两个新对象 a和b
对象锁:test2()
1、a.test2 和 a.test2会竞争,因为他们竞争同一个锁a
2、a.test2和 b.test2不会竞争,因为他们有不同的锁a和b
类锁:test5()
1、a.test5 和 a.test5会竞争,因为他们竞争同一个类锁TestSyn.class
2、a.test5和 b.test5会竞争,因为他们竞争同一个类锁TestSyn.class
示例代码
package com.gg;/*** @author: honry.guan* @create: 2020-06-02 23:26**/
public class TestSyn {//普通方法public void test1() {try {System.out.println("普通方法开始");Thread.sleep(100);System.out.println("普通方法结束");} catch (InterruptedException e) {e.printStackTrace();}}//对象锁public synchronized void test2() {try {String name = Thread.currentThread().getName();System.out.println(name+" 对象锁方法-开始");Thread.sleep(100);System.out.println(name+" 对象锁方法-结束");} catch (InterruptedException e) {e.printStackTrace();}}//对象锁public void test3() {//this指的就是我们new出来的实例,比如a,bsynchronized (this) {try {String name = Thread.currentThread().getName();System.out.println(name+" 对象锁代码块-开始");Thread.sleep(100);System.out.println(name+" 对象锁代码块-结束");} catch (InterruptedException e) {e.printStackTrace();}}}//类锁:即TestSyn.classpublic static synchronized void test4() {try {String name = Thread.currentThread().getName();System.out.println(name+" 类锁static-开始");Thread.sleep(100);System.out.println(name+" 类锁static结束");} catch (InterruptedException e) {e.printStackTrace();}}//类锁:即TestSyn.classpublic void test5() {synchronized (TestSyn.class) {try {String name = Thread.currentThread().getName();System.out.println(name+" 类锁class-开始");Thread.sleep(100);System.out.println(name+" 类锁class-结束");} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {//对象锁同一个对象测试TestSyn a = new TestSyn();Thread t1 = new Thread(() -> a.test1());Thread t2 = new Thread(() ->a.test2());Thread t3 = new Thread(() ->a.test3());t1.start();t2.start();t3.start();}
}
修改main函数,测试对象锁使用一个新建对象执行
public static void main(String[] args) {//对象锁同一个对象测试TestSyn a = new TestSyn();Thread t1 = new Thread(() -> a.test1());Thread t2 = new Thread(() ->a.test2());Thread t3 = new Thread(() ->a.test3());t1.start();t2.start();t3.start();}
结论:
1、对象锁不会锁住普通方法
2、执行对象锁一个方法test2时,另一个同步方法test3会阻塞
普通方法开始
Thread-1 对象锁方法-开始
普通方法结束
Thread-1 对象锁方法-结束
Thread-2 对象锁代码块-开始
Thread-2 对象锁代码块-结束
修改main函数,测试对象锁使用多个新建对象执行
public static void main(String[] args) {//对象锁TestSyn a = new TestSyn();TestSyn b = new TestSyn();Thread t1 = new Thread(() -> a.test1());Thread t2 = new Thread(() ->a.test2());Thread t3 = new Thread(() ->b.test2());t1.start();t2.start();t3.start();}
结论:
因为a和b是两个不同的对象锁,所以同步方法块test2可以交替执行,不会发生阻塞
普通方法开始
Thread-2 对象锁方法-开始
Thread-1 对象锁方法-开始
普通方法结束
Thread-2 对象锁方法-结束
Thread-1 对象锁方法-结束
修改main函数,执行类锁方法
public static void main(String[] args) {//类锁TestSyn a = new TestSyn();TestSyn b = new TestSyn();Thread t1 = new Thread(() -> a.test1());Thread t2 = new Thread(() -> TestSyn.test4());Thread t3 = new Thread(() -> a.test5());t1.start();t2.start();t3.start();
}
结论:
静态同步方法和锁住兑现固定.class是同一个锁,所以有竞争
普通方法开始
Thread-1 类锁static-开始
普通方法结束
Thread-1 类锁static结束
Thread-2 类锁class-开始
Thread-2 类锁class-结束
修改main函数
public static void main(String[] args) {//类锁TestSyn a = new TestSyn();TestSyn b = new TestSyn();Thread t1 = new Thread(() -> a.test1());Thread t2 = new Thread(() -> a.test5());Thread t3 = new Thread(() -> b.test5());t1.start();t2.start();t3.start();}
结论:两个不同对象调用类锁同步代码块test5方法,因为是同一个锁(类锁)所以发生竞争
普通方法开始
Thread-1 类锁class-开始
普通方法结束
Thread-1 类锁class-结束
Thread-2 类锁class-开始
Thread-2 类锁class-结束
1.5 synchronized类锁和对象锁快速区别相关推荐
- java并发编程实践学习---java的类锁和对象锁
最近在看Java Concurrent in Practice(java并发编程实践),发现自己对java的线程.锁等机制,理解很肤浅,学习的也不够全面.打算借着这本书,全面的学习下JDK的并发包和一 ...
- Java 类锁、对象锁、私有锁
3.6 Java类锁.对象锁.私有锁.隐式锁 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. ...
- Java内部锁(synchronized)中类锁和对象锁
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/77688880冷血之心的博客) synchronized是Java提 ...
- Python的类属性与对象属性的区别
Python的类属性与对象属性的区别 命名规则: 1.1 类属性由类创建,命名规则为类名.属性名 1.2 对象属性由对象创建,命名规则为对象名.属性名 调用方法: 2.1 类属性由类调用 2.2 对象 ...
- java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)
本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁和类锁.特别的是希望能帮大家理清一些概念. 一.synchronized关键字 synchronized关键字有如下两种 ...
- ThreadLocal类与Synchonized对象锁的区别
对于多线程资源共享的问题,同步机制采用了"以时间换空间"的方式,而ThreadLocal采用了"以空间换时间"的 方式.前者仅提供一份变量,让不同的线程排队访问 ...
- Synchronized代码块锁的是什么?全局锁?对象锁?
对象锁:锁的是这个对象. 全局锁:锁的是那个写了synchronized关键字的方法或者代码块. 这里主要去聊全局锁 当java关键字 Synchronized()代码块锁随便的一个类比如,Integ ...
- java守护锁_Java 对象锁-synchronized()与线程的状态与生命周期与守护进程
synchronized(someObject){ //对象锁 } 一.对象锁 someObject 的使用说明: 1.对象锁的返还. 当synchronize()语句执行完成. 当synchroni ...
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
最新文章
- GPS实时跟踪程序模拟(2)动画回放
- VMWare不能安装64位操作系统原因探析
- 【比较面】真核生物和原核生物的异同
- 第四天:规划范围管理
- LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- vs 启动调用的目标发生异常_如何解决不可测、异常场景的问题?
- 在网站中使用Cookie的简单例子
- git升级到2版本的过程记录
- 路由器截获微信消息_小白智慧微信小程序无法打印的解决方案
- 最大熵模的理解与最大熵模型逻辑回归相似转换条件
- 苹果ipad怎么录屏_原来苹果手机还能这样投屏!1秒小屏变大屏!太好用了
- Python 中国慕课第五章测试 OpenJudge作业(包含通过码)
- 怎么使用et代理换ip软件切换电脑手机的上网ip_使用教程
- PTA 7-6 新胖子公式
- Android大话设计模式 第三章----开放封闭原则---孙悟空任弼马温一职
- jquery.nicescroll.js 美化滚动条
- 服务器修改ip为什么需要重启,xp修改ip需要重启 - 卡饭网
- ResNet50 ResNeXt-50(32x4d)
- 在Wifi网络中嗅探明文密码(HTTP POST请求、POP等)
- 虚拟机安装WIN11,缺少计算机所需的介质驱动程序
热门文章
- 经纬度5位数和6位数差多少_经纬度精度差别 - Rain - OSCHINA - 中文开源技术交流社区...
- 开发自己的编程语言(五)—— CIL中间代码的生成
- #Python小技巧#教你用Python在Excel里画画
- 药店计算机信息系统知识培训,的药店信息管理系统.docx
- 360安全浏览器屏蔽网页无法访问广告
- 验证身份证号码是否有效
- vscode ssh 远程连接总是循环验证密码
- linux在3T的分区磁盘上追加空间
- 谁与争锋,JDK动态代理大战CGLib动态代理
- c语言邻接表做公园导游系统,公园导游管理系统