欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

Java-多线程-安全性-同步代码块技术

1、不加同步技术模拟售票例子

package cn.bruce.Thread;

//多线程售票案例
//解决安全问题,JAVA程序提供了同步技术synchronized(任意对象){线程要操作的共享数据}
//同步代码块
public class MoreThreadDemo2 {
    public static void main(String[] args) {
        // 创建Runnable接口实现类对象
        Tickets t = new Tickets();
        // 创建三个Thread类对象,传递Runnable接口实现类
        Thread t0 = new Thread(t, "窗口1");
        Thread t1 = new Thread(t, "窗口2");
        Thread t2 = new Thread(t, "窗口3");
        // 开启线程
        t0.start();
        t1.start();
        t2.start();

    }
}

class Tickets implements Runnable {
    private int number = 100;
    Object object = new Object();

    public void run() {
        while (true)
        {
            //synchronized(object){//同步技术不能使用匿名对象,并且速度会变慢
                //对票数做判断,大于0 可以出售
            if (number > 0)
            {
                try
                {
                    Thread.sleep(10);//使用休眠,模拟CPU切换
                    System.out.println(Thread.currentThread().getName() + "出售第" + number--);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }

            }//}
        }
    }

}

结果会出现售-1的情况

 

 2、加入同步技术后

package cn.bruce.Thread;

//多线程售票案例
//解决安全问题,JAVA程序提供了同步技术synchronized(任意对象){线程要操作的共享数据}
//同步代码块
public class MoreThreadDemo2 {
    public static void main(String[] args) {
        // 创建Runnable接口实现类对象
        Tickets t = new Tickets();
        // 创建三个Thread类对象,传递Runnable接口实现类
        Thread t0 = new Thread(t, "窗口1");
        Thread t1 = new Thread(t, "窗口2");
        Thread t2 = new Thread(t, "窗口3");
        // 开启线程
        t0.start();
        t1.start();
        t2.start();

    }
}

class Tickets implements Runnable {
    private int number = 100;
    Object object = new Object();

    public void run() {
        while (true)
        {
            synchronized(object){//同步技术不能使用匿名对象,并且速度会变慢
                //对票数做判断,大于0 可以出售
            if (number > 0)
            {
                try
                {
                    Thread.sleep(10);//使用休眠,模拟CPU切换
                    System.out.println(Thread.currentThread().getName() + "出售第" + number--);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }

            }}
        }
    }

}

不会出现异常数据,但是速度会慢一些

 

 

posted @ 2020-08-27 16:34  萧静默  阅读(132)  评论(0编辑  收藏  举报