其他分享
首页 > 其他分享> > 解决线程安全问题_同步代码块和同步技术的原理

解决线程安全问题_同步代码块和同步技术的原理

作者:互联网

同步代码块

同步代码块:javasynchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问;
格式:

synchronized(同步锁){
需要同步操作的代码
}

同步锁:
对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁
1.锁对象 可以是任意类型
2.多个线程对象要使用同一把锁
注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他线程只能在外等着

package com.yang.Test.ThreadStudy;

import lombok.SneakyThrows;

/**
 * 卖票案例出现了线程安全的问题
 * 卖出了不存在的票和重复的票
 * 解决线程安全问题的一种方案:使用同步代码块
 */
public class RunnableImpl implements Runnable{
    //定义一个多个线程共享的资源
    private int ticket = 100;

    //设置线程任务卖票
    @SneakyThrows
    @Override
    public void run() {
        //使用死循环重复卖票动作
        while(true){
            //同步代码块
            synchronized (this){
                //线判断票是否存在
                if (ticket>0){
                    //票存在,卖票,ticket--
                    System.out.println(Thread.currentThread().getName()+"--->正在卖第"+ticket+"张票");
                    ticket--;
                }else{
                    break;
                }
            }
        }
    }
}

package com.yang.Test.ThreadStudy;

public class DemoTicket {
    public static void main(String[] args) {
        RunnableImpl r1 = new RunnableImpl();
        new Thread(r1).start();
        new Thread(r1).start();
        new Thread(r1).start();
    }
}

运行结果:
image

同步技术的原理

image

标签:同步,Thread,代码,线程,ticket,public
来源: https://www.cnblogs.com/ailhy/p/16457324.html