Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4.彻底理解synchronized #4

Open
Sheamus2340 opened this issue Jun 7, 2018 · 3 comments
Open

4.彻底理解synchronized #4

Sheamus2340 opened this issue Jun 7, 2018 · 3 comments

Comments

@Sheamus2340
Copy link

如图,上面用黄色高亮的部分就是需要注意的部分了,这也是添Synchronized关键字之后独有的。执行同步代码块后首先要先执行monitorenter指令,退出的时候monitorexit指令。通过分析之后可以看出,使用Synchronized进行同步,其关键就是必须要对对象的监视器monitor进行获取,当线程获取monitor后才能继续往下执行,否则就只能等待。而这个获取的过程是互斥的,即同一时刻只有一个线程能够获取到monitor。上面的demo中在执行完同步代码块之后紧接着再会去执行一个静态同步方法,而这个方法锁的对象依然就这个类对象,那么这个正在执行的线程还需要获取该锁吗?答案是不必的,从上图中就可以看出来,执行静态同步方法的时候就只有一条monitorexit指令,并没有monitorenter获取锁的指令。这就是锁的重入性,即在同一锁程中,线程不需要再次获取同一把锁。Synchronized先天具有重入性。每个对象拥有一个计数器,当线程获取该对象锁后,计数器就会加一,释放锁后就会将计数器减一。


执行一个静态同步方法
哪里执行了同步啊?

@TarryHoo
Copy link

@Sheamus2340 这个method 少了synchronized 关键字。
private static synchronized void method() {
}

@lxx9816
Copy link

lxx9816 commented Jan 21, 2019

原文:从上图中就可以看出来,执行静态同步方法的时候就只有一条monitorexit指令,并没有monitorenter获取锁的指令。
问题:monitorexit不是执行静态同步方法时候的指令,应该是同步代码块执行异常时会执行的指令。如果同步代码块执行正常,就会执行了goto指令然后直接跳转去执行了invokestatic指令(静态方法)。

@zero9230
Copy link

zero9230 commented Sep 1, 2022

这一节图片挂了好多,能给补一下么?感谢大佬

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants