线程5 - 同步(synchronized)
Synchronized 同步
方法被synchronized 关键字修饰后成为同步方法
多线程访问同步方法时,只能顺序访问,每次访问只有一个执行
Hashtable -- 方法同步:对一个对象的增删改查等同时只能执行一个,效率低,换来数据的一致性
HashMap -- 方法异步:可以同时执行许多操作,效率高,但需要其他方法补足数据的一致性
public synchronized void test(){
//方法体
}
在方法中,代码块被synchronized 关键字修饰 -- 同步代码块,需要指定用于同步的对象,所有线程根据此对象来实现同步执行代码块中的处理逻辑 -- 同一时刻只能有一个线程使用该对象
synchronized (用于同步的对象){
//处理逻辑
}
常通过.wait() 和 .notifyAll() 方法实现线程间执行的切换,声明定义于Object类中被所有类继承,因此所有对象都可以调用这两个方法
银行排号
银行与用户间通过 num 实现同步
public class ThreadSynchronized {
public static void main(String[] args) {
Num num = new Num();
User user = new User(num);
user.start();
Bank bank = new Bank(num);
bank.start();
}
}
class Num{
}
class Bank extends Thread{
private Num num;
public Bank(Num num) {
this.num = num;
}
@Override
public void run() {
synchronized (num){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("9.00am,银行开门啦。");
num.notifyAll();
}
}
}
class User extends Thread{
private Num num;
public User(Num num) {
this.num = num;
}
@Override
public void run() {
synchronized (num){
System.out.println("我是号码一,银行还没开门,需要等待。");
try {
num.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("叫到我的号了,该我办业务了。");
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析