zoukankan      html  css  js  c++  java
  • 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();
                    }
    
                }}
            }
        }
    
    }

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

     

  • 相关阅读:
    9.11 eventbus
    9.10,,,实现new instanceof apply call 高阶函数,偏函数,柯里化
    9.9 promise实现 写完了传到gitee上面了,这里这个不完整
    9.5cors配置代码
    9.5 jsonp 实现
    9.5 http tcp https总结
    9.3 es6 class一部分 and es5 class 发布订阅
    8.30 cookie session token jwt
    8.30vue响应式原理
    warning: LF will be replaced by CRLF in renard-wx/project.config.json. The file will have its original line endings in your working directory
  • 原文地址:https://www.cnblogs.com/BruceKing/p/13572244.html
Copyright © 2011-2022 走看看