Java多线程synchronized同步方法详解

网友投稿 232 2022-12-12


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 passwohttp://rd) {

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 方法是非 synchronizehttp://d 方法,所以造成了脏读

public void getValue() {

System.out.println("getValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);

}

}

}

结果如图:

3、synchronized 锁重入

"可重入锁"的概念是:

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

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

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java小程序赛马游戏实现过程详解
下一篇:新版Android Studio3.6找不到R.java怎么处理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~