java原理篇---------synchronized简述

推荐文章:https://www.cnblogs.com/mingyao123/p/7424911.html 

                    http://www.sohu.com/a/273749069_505779          都是关于synchronized原理。

下面是我对synchronized的理解

并发问题其实就是对线程之间对资源的获取出现了竞争状态

Java synchronized关键字

是java提供的一种同步机制。也属于锁机制。synchronized可称互斥锁

java是面向对象的语言。我们知道对象都是继承Object的。也就是说所有对象都有共性。可能常见的共性大家都清楚

但是其实java对每个对象都有Monitor对象相关联。而synchronized的实现线程同步就是通过Monitor对象来完成的。

通过观察class文件你会发现如图的两个字节码指令

具体如何实现看推荐文章

在对性能有要求的程序中不推荐使用。因为本质上synchronized是牺牲性能而达到同步的一种解决方式

按锁的对象分为

对象锁 有分为实例的锁  和 属性的锁  this会导同时获取了当前实例的锁 + 实例所有属性的锁

属性这个会导致死锁。就是多个线程之间互相锁着对方的需要的对象的对象锁 

类锁 

加锁后你需明白锁作用的范围 不同范围会影响最后的结果  

下面网址是大神测试多个线程去调用一个类里面不同方法的结果

这个我在本地电脑上测试了下

结论是:一样的锁类型的情况下是互斥的,不一样的锁类型是不互斥的,各执行各的。说到底就是不同锁怎么会互斥呢

推荐这个网站:https://blog.csdn.net/Sunjy1881/article/details/76269829

下面我测试多线程调用实例中一样的方法出现的情况

两种方式

1方法上:如果为静态的,不管是否是同一实例,都互斥。如果不是静态的,相同的互斥,不同的互不影响

2同步块:如果为静态的,不管是否是同一实例,都互斥。如果不是静态的,相同的互斥,不同的互不影响

性能比较:静态比非静态好一些(也不是好很多,主要性能提升在于静态的初始化,有且只有一个,这个原因,求大神指教,这个是自己分析的)。所谓的同步块比方法好,这个效果有限,基本一致。可能是那种同步块前有较复杂的逻辑或耗时操作性能好点。性能测试报告就不截图啦心累

测试如下:

1静态同步块上加synchronized 。同一实例互斥。不同实例互斥

 

2静态方法上加synchronized,同一实例互斥,不同实例互斥

 

 

 

 

 

 

 

3非静态方法上同步。同一实例互斥。不同实例各执行各的。互不影响

 

 

 

 

4非静态方法同步块方式同步。同一实例互斥。不同实例各执行各的。互不影响

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值