←←←←←←←←←←←← 快!点关注

不同的对象

public class Sync {public synchronized void test() {System.out.println("test start");try {Thread.sleep(5000);}catch (InterruptedException e) {e.printStackTrace();}System.out.println("test end");}
}
复制代码
public class MyThread extends Thread{public void run() {Sync sync = new Sync();sync.test();}public static void main(String[] args) {for (int i = 0; i < 3; ++i) {Thread thread = new MyThread();thread.start();}}
}
复制代码

执行结果

test start
test start
test start
test end
test end
test end&emsp;&emsp;
复制代码

现象

在MyThread中,每次都new一个新的Sync对象,可以看到代码块test虽然被加了synchonized但是还是并行执行的,初步结论:锁住的不是代码块

同一个对象

public class MyThread2 extends Thread{public Sync sync;MyThread2(Sync sync) {this.sync = sync;}public void run() {System.out.println("hi....");sync.test();}public static void main(String[] args) {Sync sync = new Sync();for (int i = 0; i < 3; ++i) {Thread thread = new MyThread2(sync);thread.start();}}
复制代码

执行结果

hi....
test start
hi....
hi....
test end
test start
test end
test start
test end&emsp;&emsp;
复制代码

现象

可以看到当他们共用一个对象的时候,synchonized起了作用,这块代码是串行执行的

结论

锁住的是对象

如何在多对象的时候任然锁住代码?

解决也很简单,只要锁住同一个对象就行了。例如:synchronized后的括号中锁同一个固定对象,这样就行了。

这样是没问题,但是,比较多的做法是让synchronized锁这个类对应的Class对象。

public class Sync2 {public void test() {synchronized (Sync2.class) {System.out.println("test start");try {Thread.sleep(2000);}catch (InterruptedException e) {e.printStackTrace();}System.out.println("test end");}}
}
复制代码
public class MyThread3 extends Thread{public void run() {Sync2 sync = new Sync2();sync.test();}public static void main(String[] args) {for (int i = 0; i < 3; ++i) {Thread thread = new MyThread3();thread.start();}}
}
复制代码

执行结果

test start
test end
test start
test end
test start
test end
复制代码

synchronized的两大不足

  • 由于我们没办法设置synchronized关键字在获取锁的时候等待时间,所以synchronized可能会导致线程为了加锁而无限期地处于阻塞状态
  • 使用synchronized关键字等同于使用了互斥锁,即其他线程都无法获得锁对象的访问权。这种策略对于读多写少的应用而言是很不利的,因为即使多个读者看似可以并发运行,但他们实际上还是串行的,并将最终导致并发性能的下降。

虽然synchronized已经作为一个关键字被固化在Java语言中了,但它只提供了一种相当保守的线程安全策略,且该策略开放给程序员的控制能力极弱

读者福利:

分享免费学习资料

针对于Java程序员,我这边准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

资料领取方式:加入Java技术交流群963944895,点击加入群聊,私信管理员即可免费领取

转载于:https://juejin.im/post/5cb32e39e51d456e361ed8bd

【本人秃顶程序员】synchronized锁住的是代码还是对象相关推荐

  1. Java线程同步:synchronized锁住的是代码还是对象

    在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在 ...

  2. 【本人秃顶程序员】Redis 这么火,它都解决了哪些问题?

    ←←←←←←←←←←←← 快!点关注 先看一下Redis是一个什么东西.官方简介解释到: Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存 ...

  3. 【本人秃顶程序员】我简历上的Java项目都好low,怎么办?

    ←←←←←←←←←←←← 快!点关注 这篇文章我们来聊一聊,在系统设计和项目经验这两块,应该如何充分的准备,才能拿出有技术含量的项目经验战胜跟你同台竞技的其他工程师,征服你的面试官,收获各种心仪的of ...

  4. 【本人秃顶程序员】使用Spring Cloud Stream和RabbitMQ实现事件驱动的微服务

    ←←←←←←←←←←←← 快!点关注 让我们展示如何使用Spring Cloud Stream来设计事件驱动的微服务.首先,Spring Cloud Stream首先有什么好处?因为Spring AM ...

  5. 【本人秃顶程序员】过年了,给亲朋好友解释“啥是程序员”

    ←←←←←←←←←←←← 快!点关注 一年一度的春节又到了,作为程序员的你是怎么告诉亲朋好友自己日常到底是做什么工作的呢? 程序员是一个新兴的职业,我在上大学以前不了解程序员到底是做什么的,对编程语言 ...

  6. java程序员秃顶,【本人秃顶程序员】使用Azure Function + Cognitive Services 实现图片自动化审核...

    ←←←←←←←←←←←← 快!点关注 假定我们正在运行某个应用程序,此应用程序需要用户在应用程序中提交大量图片文件,那么对于系统管理员来说手动审核这些图片是很消耗时间的,并且对于图片的审核也许并不是即 ...

  7. 【本人秃顶程序员】美女程序员观点:程序员最重要的非编程技巧

    ←←←←←←←←←←←← 快!点关注 这是来自一位美女程序员Ali Spittel的观点,至少可以看看美女喜欢和怎样的男程序猿打交道: 当我想与我希望的程序员合作时,我更多地考虑非技术技能,而不是技术 ...

  8. 【本人秃顶程序员】图解分布式架构的演进过程

    ←←←←←←←←←←←← 快!点关注!!! 一.什么是分布式架构 分布式系统(distributed system) 是建立在网络之上的软件系统. 内聚性: 是指每一个数据库分布节点高度自治,有本地的 ...

  9. 【本人秃顶程序员】Java面试题集(意思意思)

    ←←←←←←←←←←←← 我都秃顶了,还不点关注! 一.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于MVC架构的 用来简化web应用程序开发的 ...

  10. 【本人秃顶程序员】分享一些数据结构与算法常用的算法技巧总结

    今天和大家讲讲,在做算法题时常用的一些技巧.对于平时没用过这些技巧的人,或许你可以考虑试着去看看在实践中能否用的上这些技巧来优化问题的解. 一.巧用数组下标 数组的下标是一个隐含的很有用的数组,特别是 ...

最新文章

  1. TensorFlow中设置学习率的方式
  2. 34丨关于Linux网络,你必须知道这些(下)
  3. binaryoperator java_BinaryOperatorT接口的用法示例
  4. 利用正则获取url传递的数据
  5. 顺丰正式杀入外卖领域;中国移动推出 5G 消息 App;GCC 10.1 发布 | 极客头条
  6. VoLTE技术中的会话持续性-ICS
  7. 为何数据治理如此重要
  8. 【业界分享】字节跳动如何用 7 年,成为腾讯最可怕的对手?张一鸣一语道破...
  9. mysql-5.7.12安装
  10. Effective C++ -----条款18:让接口容易被正确使用,不易被误用
  11. 极速稳定网络加速服务器,零点云 极速服务器
  12. a as as big rat_Whats the meaning of give a rats as..._考试资料网
  13. 博士生如何进行文献阅读和文献整理?
  14. 深度学习AI美颜系列---美图秀秀AI美图之跨次元相机特效
  15. VM虚拟机安装及使用
  16. 复习一下forearch
  17. 双碳背景下个人的低碳环保生活
  18. html验证座机号码_js验证输入是否为手机号码或电话号码示例
  19. 5+App和uni-app在App开发上有何区别?
  20. java教务管理系统数据库设计_计算机毕业设计选题及代做定做流程

热门文章

  1. 深入解析windows操作系统。。。。
  2. java直接内存为什么快_直接内存与 JVM 源码分析
  3. 启动mysql服务是报错找不到pid_mysql报错 The server quit without updating PID file
  4. 导入python库linux_Linux下Python安装PyMySQL成功,但无法导入的问题
  5. oracle full outer join,oracle 内连接(inner join)、外连接(outer join)、全连接(full join)...
  6. 项目服务器有15个能说明什么,15.1 我的面试经历 by smyhvae - 前端入门进阶
  7. 微型计算机原理及应用李干林,微机原理及接口技术李干林习题参考解答-20210415154329.docx-原创力文档...
  8. 一款N-沟道耗尽型JFET晶体管 MPF102
  9. php微信扫码支付报错,(转)微信调用扫码和支付功能是都报错 the permission value is offline verifying...
  10. dock run mysql v3_docker run mysql成功,但是3306端口不通?