【多线程1】:synchronized关键字(同步锁、可重入锁、非公平锁)

r囧r小猫 2022-04-22 14:24 238阅读 0赞

首先,什么是锁,为什么要用这个玩意儿?
掌握Java中锁是Java多线程编程中绕不开的知识,只有知道理解Java各种锁才能在编码过程中灵活运用,写出更高效的多线程程序。而理解掌握锁的第一步,可从宏观上对比理解一下各种锁概念。


synchronized同步锁:

  1. public class UserInfoService {
  2. /** 普通代码 **/
  3. public String getUserInfo(String id) {
  4. // TODO
  5. Sysotem.out.println("--------------普通代码(无锁)--------------");
  6. return null;
  7. }
  8. // 同步锁(锁方法体)
  9. public synchronized String getUserInfo(String id) {
  10. // TODO
  11. Sysotem.out.println("--------------同步锁(锁方法体)--------------");
  12. return null;
  13. }
  14. // 同步锁(锁代码块)
  15. public String getUserInfo(String id) {
  16. synchronized (this) {
  17. // TODO
  18. Sysotem.out.println("--------------同步锁(锁代码块)--------------");
  19. }
  20. return null;
  21. }
  22. }

synchronized可重入锁:
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。
对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。
对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。

  1. synchronized void setA() throws Exception{
  2. Thread.sleep(1000);
  3. setB();
  4. }
  5. synchronized void setB() throws Exception{
  6. Thread.sleep(1000);
  7. }

上面的代码就是一个可重入锁的一个特点,如果不是可重入锁的话,setB可能不会被当前线程执行,可能造成死锁。

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!


持续更新中…

如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:
你遇到的问题是小编创作灵感的来源!


发表评论

表情:
评论列表 (有 0 条评论,238人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线-

    3.4 可重入锁(递归锁) 3.4.1 概念说明 是指在同一线程在外层方法获取到锁的时侯,在进入该线程的内层方法会自动获取锁(前提,锁对 象的是同一个对象),不会因为之前