同步锁代码块

mac2022-06-30  22

package com.itheima.demo07.Synchronized;/*    卖票案例出现了线程安全问题    卖出了不存在的票和重复的票    解决线程安全问题的一种方案:使用同步代码块    格式:        synchronized(锁对象){            可能会出现线程安全问题的代码(访问了共享数据的代码)        }    注意:        1.通过代码块中的锁对象,可以使用任意的对象        2.但是必须保证多个线程使用的锁对象是同一个        3.锁对象作用:            把同步代码块锁住,只让一个线程在同步代码块中执行 */public class RunnableImpl implements Runnable{    //定义一个多个线程共享的票源    private  int ticket = 100;    //创建一个锁对象    Object obj = new Object();    //设置线程任务:卖票    @Override    public void run() {        //使用死循环,让卖票操作重复执行        while(true){           //同步代码块            synchronized (obj){                //先判断票是否存在                if(ticket>0){                    //提高安全问题出现的概率,让程序睡眠                    try {                        Thread.sleep(10);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    //票存在,卖票 ticket--                    System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");                    ticket--;                }            }        }    }}

 

package com.itheima.demo07.Synchronized;/*    模拟卖票案例    创建3个线程,同时开启,对共享的票进行出售 */public class Demo01Ticket {    public static void main(String[] args) {        //创建Runnable接口的实现类对象        RunnableImpl run = new RunnableImpl();        //创建Thread类对象,构造方法中传递Runnable接口的实现类对象        Thread t0 = new Thread(run);        Thread t1 = new Thread(run);        Thread t2 = new Thread(run);        //调用start方法开启多线程        t0.start();        t1.start();        t2.start();    }}

转载于:https://www.cnblogs.com/newcityboy/p/11235140.html

最新回复(0)