线程同步

方式一  : 同步代码块

作用:把出现线程安全问题的核心代码给上锁。

原理:每次只能一个线程进入,执行完毕后自动解锁,其他线程才可以进来执行。

public void drawMoney(double money){
//先获取谁来取钱
String name = Thread.currentThread().getName();

//同步代码块
//this == acc 共享账户
synchronized (this) {
//1. 判断账户是否够钱
if (this.money >= money){
//2. 取钱
System.out.println(name + "来取钱成功, 吐出" + money);
this.money -= money;
System.out.println(name+"取钱后剩余"+this.money);
}else {
//4. 余额不足
System.out.println(name+"来取钱,余额不足");
}
}
}

同步代码块是如何实现线程安全的?

对出现问题的核心代码使用synchronized进行加锁

每次只能一个线程占锁进入访问

==

同步代码块的同步锁对象有什么要求?

对于实例方法建议使用this作为锁对象。

对于静态方法建议使用字节码(类名.class)对象作为锁对象。

=====================

方式二  同步方法

作用:把出现线程安全问题的核心方法给上锁

原理:每次只能一个线程进入,执行完毕以后自动解锁,其他线程才可以进来执行。

修饰符 synchronized 返回值类型 方法名称(形参列表) { 操作共享资源的代码 }

 

注意: 

同步方法其实底层也是有隐式锁对象的,只是锁的范围是整个方法代码。

如果方法是实例方法:同步方法默认用this作为的锁对象。但是代码要高度面向对象!

如果方法是静态方法:同步方法默认用类名.class作为的锁对象。

posted on 2022-03-30 23:51  我要当程序源  阅读(22)  评论(0编辑  收藏  举报

导航