【Java--线程】多线程的同步机制(锁):synchronized

本文介绍了Java中的同步机制,特别是synchronized关键字的使用。通过一个吃包子的例子,展示了同步块和同步方法的实现,确保了线程安全,防止数据不一致。测试输出显示了线程交替执行的情况。
摘要由CSDN通过智能技术生成

同步机制

所谓同步机制,指的是两个线程同时作用在一个对象上,应该保持对象数据的统一性和整体性。

 synchronized 关键字

专门负责管理线程对象中同步方法访问的工具——同步模型监视器,它的原理是为每个具有同步代码的对象准备唯一的一把“锁”。当多个线程访问对象时,只有取得锁的线程才能进入同步方法,其他访问共享对象的线程停留在对象中等待。

实现代码:

举个,吃包子的例子:

同步块:

public class 吃包子 extends Thread{
    private 包子笼 p = null;
    private String name = null;
    public 吃包子(包子笼 p , String name){
        this.p = p;
        this.name = name;
    }

    public void run(){
        try {
            while (true) {
                synchronized (p) {//()相当于锁,也叫同步监视器
                    if (p.eat (this.name)) break;
                }//只有一个同步块可以吃包子
                Thread.sleep (1);
            }
        }catch (InterruptedException e){
            e.printStackTrace ();
        }
    }
}

同步方法:

public class 包子笼 {
    public int pack = 100;

    /**
     * 同步方法监视的对象是this
     * @param name
     */
    public synchronized boolean eat(String name){
        if (this.pack <= 0) return true;
        System.out.println(name + "吃第" + this.pack + "个包子");
        this.pack--;
        return false;
    }
}

测试:

public class Test包子 {
    public static void main(String[] args) {
        包子笼 p = new 包子笼 ();
        吃包子 c1 = new 吃包子 (p, "索隆");
        吃包子 c2 = new 吃包子 (p, "路飞");
        c1.start ();
        c2.start ();
    }
}

输出:

索隆吃第100个包子
路飞吃第99个包子
路飞吃第98个包子
索隆吃第97个包子
索隆吃第96个包子
路飞吃第95个包子
索隆吃第94个包子
路飞吃第93个包子
索隆吃第92个包子
路飞吃第91个包子
索隆吃第90个包子
路飞吃第89个包子
路飞吃第88个包子
索隆吃第87个包子
索隆吃第86个包子
路飞吃第85个包子
索隆吃第84个包子
路飞吃第83个包子
索隆吃第82个包子
路飞吃第81个包子
路飞吃第80个包子
索隆吃第79个包子
索隆吃第78个包子
路飞吃第77个包子
索隆吃第76个包子
路飞吃第75个包子
路飞吃第74个包子
索隆吃第73个包子
索隆吃第72个包子
路飞吃第71个包子
索隆吃第70个包子
路飞吃第69个包子
路飞吃第68个包子
索隆吃第67个包子
路飞吃第66个包子
索隆吃第65个包子
路飞吃第64个包子
索隆吃第63个包子
索隆吃第62个包子
路飞吃第61个包子
索隆吃第60个包子
路飞吃第59个包子
路飞吃第58个包子
索隆吃第57个包子
索隆吃第56个包子
路飞吃第55个包子
索隆吃第54个包子
路飞吃第53个包子
路飞吃第52个包子
索隆吃第51个包子
路飞吃第50个包子
索隆吃第49个包子
索隆吃第48个包子
路飞吃第47个包子
索隆吃第46个包子
路飞吃第45个包子
路飞吃第44个包子
索隆吃第43个包子
路飞吃第42个包子
索隆吃第41个包子
路飞吃第40个包子
索隆吃第39个包子
路飞吃第38个包子
索隆吃第37个包子
路飞吃第36个包子
索隆吃第35个包子
索隆吃第34个包子
路飞吃第33个包子
路飞吃第32个包子
索隆吃第31个包子
路飞吃第30个包子
索隆吃第29个包子
索隆吃第28个包子
路飞吃第27个包子
路飞吃第26个包子
索隆吃第25个包子
路飞吃第24个包子
索隆吃第23个包子
索隆吃第22个包子
路飞吃第21个包子
索隆吃第20个包子
路飞吃第19个包子
索隆吃第18个包子
路飞吃第17个包子
路飞吃第16个包子
索隆吃第15个包子
索隆吃第14个包子
路飞吃第13个包子
路飞吃第12个包子
索隆吃第11个包子
路飞吃第10个包子
索隆吃第9个包子
索隆吃第8个包子
路飞吃第7个包子
索隆吃第6个包子
路飞吃第5个包子
路飞吃第4个包子
索隆吃第3个包子
路飞吃第2个包子
索隆吃第1个包子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值