线程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("叫到我的号了,该我办业务了。");
        }
    }
}
posted @   LaViez  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示