美文网首页
Synchronized(对象锁)和Static Synchro

Synchronized(对象锁)和Static Synchro

作者: 杰奎琳子 | 来源:发表于2020-07-20 18:26 被阅读0次

场景:面试的时候经常用得到

1 综述

Synchronized和Static Synchronized区别

一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。

实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。

注: static 说明了该类的一个静态资源,不管new了多少个对象,只有一份,所以对该类的所有对象都加了锁!(实践才能更好的理解)

实例锁是锁特定的实例(只要有synchronized就会去锁该实例),全局锁是锁所有的实例。

synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块(注:是所有),注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。

static synchronized恰好就是要控制类的所有实例的并发访问,static synchronized是限制多线程中该类的所有实例同时访问jvm中该类所对应的代码块。

也就是说synchronized相当于 this.synchronized,而static synchronized相当于Something.synchronized.

2 synchronized methods(){} 与synchronized(this){}

synchronized methods(){} 与synchronized(this){}之间没有什么区别。

只是synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。

synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。

synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下

synchronized(syncObject) {

  //允许访问控制的代码  }

synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

相关文章

网友评论

      本文标题:Synchronized(对象锁)和Static Synchro

      本文链接:https://www.haomeiwen.com/subject/obwekktx.html