Java多线程synchronized同步方法详解

作者:lkc9 时间:2023-06-30 00:39:42 

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);
   }
 }
}

结果如图:

Java多线程synchronized同步方法详解

3、synchronized 锁重入

"可重入锁"的概念是:

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

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

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

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

来源:https://www.cnblogs.com/lkc9/p/12459735.html

标签:Java,synchronized,同步
0
投稿

猜你喜欢

  • 基于java SSM springboot实现抗疫物质信息管理系统

    2021-12-01 13:46:34
  • Maven打包jar包没有主属性问题解决方案

    2023-11-25 06:56:32
  • Java List 用法实例详解

    2022-11-29 05:27:20
  • 新手学习Java对Redis简单操作

    2023-09-10 05:05:41
  • spring声明式事务 @Transactional 不回滚的多种情况以及解决方案

    2023-07-06 10:50:33
  • Android中ListActivity用法实例分析

    2022-08-14 21:52:34
  • c#中虚函数的相关使用方法

    2022-10-25 05:44:53
  • 谈谈HttpClient使用详解

    2022-11-03 08:19:02
  • IntelliJ IDEA 如何配置git的操作方法

    2021-12-28 11:24:44
  • C#和SQL实现的字符串相似度计算代码分享

    2021-06-10 14:23:20
  • MyBatis字段名和属性名不一致的解决方法

    2022-12-15 18:15:22
  • C#委托与匿名委托详解

    2023-02-24 21:12:41
  • 详解在Spring3中使用注解(@Scheduled)创建计划任务

    2022-11-14 15:39:34
  • string boot 与 自定义interceptor的实例讲解

    2023-10-27 17:03:20
  • Java通过CMD方式读取注册表任意键值对代码实践

    2021-10-10 19:56:40
  • Java设计模式之工厂模式

    2023-12-18 01:40:50
  • 混合语言编程—C#使用原生的Directx和OpenGL绘图的方法

    2022-06-18 14:36:41
  • Java 8新特性方法引用详细介绍

    2023-06-22 08:31:50
  • 详解如何为SpringBoot项目中的自定义配置添加IDE支持

    2021-10-07 05:51:01
  • C#在Excel表格中插入、编辑和删除批注

    2023-01-12 13:52:20
  • asp之家 软件编程 m.aspxhome.com