synchronized关键字的作用
Java中的关键字synchronized
的作用应该都明白,在并发编程中经常使用,是JVM级的锁实现,这里就不做过多说明。它的用法是提供一个key
来使代码块互斥的被多个线程执行。笔者这里的说法可能和常规说法有点不同。因为我用了一个key
的概念。笔者认为,它的底层实现就是一个key。哪个线程竞争到了key,就能开锁进入被锁住的代码块中执行,否则将无限等待下去。
如何理解synchronized的key
我们知道使用synchronized时,可以有类锁、对象锁、静态方法块锁、对象方法锁。这些情况是真的多,初看还真有点复杂。但今天我们不从这个角度来理解,我们从我这里强调用key的思路来理解。
//伪代码,
//只要在同一个JVM中,下面这段代码无论在哪里执行(同一个类中、不同类中、不同jar包)
//只要key相同(这里的相同,耐人寻味哈),那么必定互斥的执行。
//这段注释便是synchronized的本质。
synchronized(key){
//锁住代码块
}
synchronized的本质
只要在同一个JVM中,上面这段代码无论在哪里执行(同一个类中、不同类中、不同jar包)
只要key相同(这里的相同,耐人寻味哈),那么必定互斥的执行。
这便是synchronized的本质。
如何理解key相同
内存地址相同。(这里对JMM和JVM的分布还不是特别的清楚,查了资料后再补充)
将key与Java写法相对应
key=this的情况
public synchronized void fun1(){
}
public void fun2(){
synchronized(this){
}
}
字节码
@groovyx.ast.bytecode.Bytecode