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文件你会发现如图的两个字节码指令

java原理篇---------synchronized简述_第1张图片

具体如何实现看推荐文章

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

按锁的对象分为

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

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

类锁 

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

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

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

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

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

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

两种方式

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

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

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

测试如下:

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

java原理篇---------synchronized简述_第2张图片

java原理篇---------synchronized简述_第3张图片

 

java原理篇---------synchronized简述_第4张图片

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

java原理篇---------synchronized简述_第5张图片

java原理篇---------synchronized简述_第6张图片

java原理篇---------synchronized简述_第7张图片

 

 

 

 

 

 

 

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

java原理篇---------synchronized简述_第8张图片

java原理篇---------synchronized简述_第9张图片

 

java原理篇---------synchronized简述_第10张图片

 

 

 

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

java原理篇---------synchronized简述_第11张图片

java原理篇---------synchronized简述_第12张图片

java原理篇---------synchronized简述_第13张图片

java原理篇---------synchronized简述_第14张图片

java原理篇---------synchronized简述_第15张图片

 

 

你可能感兴趣的:(原理)