Java多线程synchronized同步方法详解

 更新时间:2020年03月11日 10:12:30   作者:lkc9  
这篇文章主要介绍了Java多线程synchronized同步方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、synchronized 方法与锁对象

  线程锁的是对象。

  1)A线程先持有 object 对象的 Lock 锁, B线程可以以异步的方式调用 object 对象中的非 synchronized 类型的方法

  2)A线程先持有 object 对象的 Lock 锁, B线程如果在这时调用 object 对象中的 synchronized 类型的方法,则需要等待,也就是同步。

2、脏读(DirtyRead)

  示例:

public class DirtyReadTest {
  public static void main(String[] args) {
    try {
      PublicVar publicVar = new PublicVar();
      ThreadA thread = new ThreadA(publicVar);
      thread.start();
      Thread.sleep(200);
      publicVar.getValue();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  static class ThreadA extends Thread {
    private PublicVar publicVar;

    public ThreadA(PublicVar publicVar) {
      this.publicVar = publicVar;
    }

    @Override
    public void run() {
      super.run();
      publicVar.setValue("B", "BB");
    }
  }

  static class PublicVar {
    public String username = "A";
    public String password = "AA";

    synchronized public void setValue(String username, String password) {
      try {
        this.username = username;
        Thread.sleep(1000);
        this.password = password;
        System.out.println("setValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    // 因为 getValue 方法是非 synchronized 方法,所以造成了脏读
    public void getValue() {
      System.out.println("getValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
    }
  }
}

结果如图:

3、synchronized 锁重入

  "可重入锁"的概念是:

  自己可以再次活得自己的内部锁。比如有1条线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可以锁重入的话,就会造成死锁。

  可重入锁也支持在父子类继承的环境中:在继承中,子类是完全可以通过“可重入锁”调用父类的同步方法的。

4、出现异常,锁自动释放

  线程出现异常,会释放当前线程的锁

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 实例详解Java8函数式接口

    实例详解Java8函数式接口

    本文给大家分析了Java8默认方法和函数式接口实例其它创建方式,需要的朋友跟着学习下吧。
    2017-11-11
  • java实现图片验证码

    java实现图片验证码

    这篇文章主要为大家详细介绍了java实现图片验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • java整数与byte数组的转换实现代码

    java整数与byte数组的转换实现代码

    这篇文章主要介绍了java整数与byte数组的转换实现代码的相关资料,需要的朋友可以参考下
    2017-07-07
  • JAVA用递归实现全排列算法的示例代码

    JAVA用递归实现全排列算法的示例代码

    这篇文章主要介绍了JAVA用递归实现全排列算法的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • SpringMVC框架搭建idea2021.3.2操作数据库的示例详解

    SpringMVC框架搭建idea2021.3.2操作数据库的示例详解

    这篇文章主要介绍了SpringMVC框架搭建idea2021.3.2操作数据库,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Java SpringBoot高级用法详解

    Java SpringBoot高级用法详解

    这篇文章主要为大家详细介绍了Java Spring Boot的一些高级用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-09-09
  • SpringBoot中通过AOP整合日志文件的实现

    SpringBoot中通过AOP整合日志文件的实现

    本文主要介绍了SpringBoot中通过AOP整合日志文件的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java保留两位小数的几种写法总结

    Java保留两位小数的几种写法总结

    相信大家在平时做项目时,可能会有这样的业务需求: 页面或界面上展示的数据保留小数点后两位。 那么这篇文章小编就和大家分享了利用Java保留两位小数的几种写法,文章给出了详细的示例代码,对大家的学习和理解很有帮助,有需要的朋友们下面来一起学习学习下吧。
    2016-11-11
  • 深入了解Spring控制反转IOC原理

    深入了解Spring控制反转IOC原理

    IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。这篇文章将为大家介绍一下Spring控制反转IOC的原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java中Thread和Runnable创建线程的方式对比

    Java中Thread和Runnable创建线程的方式对比

    本文主要介绍了Java中Thread和Runnable创建线程的方式对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论