下面是我对synchronized的理解
并发问题其实就是对线程之间对资源的获取出现了竞争状态
Java synchronized关键字
是java提供的一种同步机制。也属于锁机制。synchronized可称互斥锁
java是面向对象的语言。我们知道对象都是继承Object的。也就是说所有对象都有共性。可能常见的共性大家都清楚
但是其实java对每个对象都有Monitor对象相关联。而synchronized的实现线程同步就是通过Monitor对象来完成的。
通过观察class文件你会发现如图的两个字节码指令
具体如何实现看推荐文章
在对性能有要求的程序中不推荐使用。因为本质上synchronized是牺牲性能而达到同步的一种解决方式
按锁的对象分为
对象锁 有分为实例的锁 和 属性的锁 this会导同时获取了当前实例的锁 + 实例所有属性的锁。
属性这个会导致死锁。就是多个线程之间互相锁着对方的需要的对象的对象锁
类锁
加锁后你需明白锁作用的范围 不同范围会影响最后的结果
下面网址是大神测试多个线程去调用一个类里面不同方法的结果
这个我在本地电脑上测试了下
结论是:一样的锁类型的情况下是互斥的,不一样的锁类型是不互斥的,各执行各的。说到底就是不同锁怎么会互斥呢
下面我测试多线程调用实例中一样的方法出现的情况
两种方式
1方法上:如果为静态的,不管是否是同一实例,都互斥。如果不是静态的,相同的互斥,不同的互不影响
2同步块:如果为静态的,不管是否是同一实例,都互斥。如果不是静态的,相同的互斥,不同的互不影响
性能比较:静态比非静态好一些(也不是好很多,主要性能提升在于静态的初始化,有且只有一个,这个原因,求大神指教,这个是自己分析的)。所谓的同步块比方法好,这个效果有限,基本一致。可能是那种同步块前有较复杂的逻辑或耗时操作性能好点。性能测试报告就不截图啦心累
测试如下:
1静态同步块上加synchronized 。同一实例互斥。不同实例互斥
2静态方法上加synchronized,同一实例互斥,不同实例互斥
3非静态方法上同步。同一实例互斥。不同实例各执行各的。互不影响
4非静态方法同步块方式同步。同一实例互斥。不同实例各执行各的。互不影响