Java中synchronized同步方法如何实现多线程同步?

2026-05-28 05:211阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计558个文字,预计阅读时间需要3分钟。

Java中synchronized同步方法如何实现多线程同步?

1. 使用 `synchronized` 方法与对象锁的线程是:对象锁。

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

1.A 线程先持有 `object` 对象的 `L` 锁。

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、出现异常,锁自动释放

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

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

本文共计558个文字,预计阅读时间需要3分钟。

Java中synchronized同步方法如何实现多线程同步?

1. 使用 `synchronized` 方法与对象锁的线程是:对象锁。

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

1.A 线程先持有 `object` 对象的 `L` 锁。

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、出现异常,锁自动释放

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

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