快速区别:

对象锁:

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类锁和对象锁快速区别相关推荐

  1. java并发编程实践学习---java的类锁和对象锁

    最近在看Java Concurrent in Practice(java并发编程实践),发现自己对java的线程.锁等机制,理解很肤浅,学习的也不够全面.打算借着这本书,全面的学习下JDK的并发包和一 ...

  2. Java 类锁、对象锁、私有锁

    3.6 Java类锁.对象锁.私有锁.隐式锁 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. ...

  3. Java内部锁(synchronized)中类锁和对象锁

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/77688880冷血之心的博客) synchronized是Java提 ...

  4. Python的类属性与对象属性的区别

    Python的类属性与对象属性的区别 命名规则: 1.1 类属性由类创建,命名规则为类名.属性名 1.2 对象属性由对象创建,命名规则为对象名.属性名 调用方法: 2.1 类属性由类调用 2.2 对象 ...

  5. java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)

    本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁和类锁.特别的是希望能帮大家理清一些概念. 一.synchronized关键字 synchronized关键字有如下两种 ...

  6. ThreadLocal类与Synchonized对象锁的区别

    对于多线程资源共享的问题,同步机制采用了"以时间换空间"的方式,而ThreadLocal采用了"以空间换时间"的 方式.前者仅提供一份变量,让不同的线程排队访问 ...

  7. Synchronized代码块锁的是什么?全局锁?对象锁?

    对象锁:锁的是这个对象. 全局锁:锁的是那个写了synchronized关键字的方法或者代码块. 这里主要去聊全局锁 当java关键字 Synchronized()代码块锁随便的一个类比如,Integ ...

  8. java守护锁_Java 对象锁-synchronized()与线程的状态与生命周期与守护进程

    synchronized(someObject){ //对象锁 } 一.对象锁 someObject 的使用说明: 1.对象锁的返还. 当synchronize()语句执行完成. 当synchroni ...

  9. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

最新文章

  1. GPS实时跟踪程序模拟(2)动画回放
  2. VMWare不能安装64位操作系统原因探析
  3. 【比较面】真核生物和原核生物的异同
  4. 第四天:规划范围管理
  5. LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  6. vs 启动调用的目标发生异常_如何解决不可测、异常场景的问题?
  7. 在网站中使用Cookie的简单例子
  8. git升级到2版本的过程记录
  9. 路由器截获微信消息_小白智慧微信小程序无法打印的解决方案
  10. 最大熵模的理解与最大熵模型逻辑回归相似转换条件
  11. 苹果ipad怎么录屏_原来苹果手机还能这样投屏!1秒小屏变大屏!太好用了
  12. Python 中国慕课第五章测试 OpenJudge作业(包含通过码)
  13. 怎么使用et代理换ip软件切换电脑手机的上网ip_使用教程
  14. PTA 7-6 新胖子公式
  15. Android大话设计模式 第三章----开放封闭原则---孙悟空任弼马温一职
  16. jquery.nicescroll.js 美化滚动条
  17. 服务器修改ip为什么需要重启,xp修改ip需要重启 - 卡饭网
  18. ResNet50 ResNeXt-50(32x4d)
  19. 在Wifi网络中嗅探明文密码(HTTP POST请求、POP等)
  20. 虚拟机安装WIN11,缺少计算机所需的介质驱动程序

热门文章

  1. 经纬度5位数和6位数差多少_经纬度精度差别 - Rain - OSCHINA - 中文开源技术交流社区...
  2. 开发自己的编程语言(五)—— CIL中间代码的生成
  3. #Python小技巧#教你用Python在Excel里画画
  4. 药店计算机信息系统知识培训,的药店信息管理系统.docx
  5. 360安全浏览器屏蔽网页无法访问广告
  6. 验证身份证号码是否有效
  7. vscode ssh 远程连接总是循环验证密码
  8. linux在3T的分区磁盘上追加空间
  9. 谁与争锋,JDK动态代理大战CGLib动态代理
  10. c语言邻接表做公园导游系统,公园导游管理系统