zoukankan      html  css  js  c++  java
  • java 多线程3(线程安全)

    需求:模拟三个窗口同时买票。

    问题1:static 修饰num,只创建一份在内存中,要不就会创建3份。

    问题2:线程安全问题。(代码重1的红色字体)

    出现的原因:存在两个或两个以上的线程对象,而且线程间共享着一个资源,

          有多个语句操作了共享资源。

    解决方式:加个,synchronized,把锁放到出现线程安全问题的地方,当多个线程一起

          来访问时(线程1,线程2,线程3),看谁先强到锁,先抢到的“人”,拿到锁,

          然后把门“锁上”,就执行它自己的,而其余的线程就在“门外”等,直到它出来了,

          这时锁的状态就变成“开”,然后他们三个再继续一起“抢”,循环这一过程。

    注意:公共的锁有且只有一把,多了就不能解决问题了。

    那么么既然锁这么好用我们是不都要在自己代码中加个“锁”呢?

    答:不是的,没有必要的时候是不用加的,否则会降低效率,如:判断锁的“开”和“关“,那也是要消耗时间的。

    import java.util.Scanner;
    
    public class EX10 {
        public static void main(String[] args) {
        SaleTicket t1 = new SaleTicket("chongkuo 1");
            SaleTicket t2 = new SaleTicket("chongkuo 2");
            SaleTicket t3 = new SaleTicket("chongkuo 3");
            t1.start();
            t2.start();
            t3.start();
        }
    }
    
    class SaleTicket extends Thread{
        static int num = 50;
        static Object o = new Object();
        public SaleTicket(String name){
            super(name);
        }
    
        @Override
        public void run() {
            while(true) {
                synchronized ("锁"){
                    if(num > 0){
                        System.out.println(Thread.currentThread().getName() + "售出了第-------- " + num + "号票");
                        try{
                            Thread.sleep(100);
                        }catch (InterruptedException e){
                            e.printStackTrace();
                        }
                        num--;
                    }else{
                        System.out.println("卖完了");
                        break;
                    }
                }
            }
        }
    }
  • 相关阅读:
    Linux strip
    有趣的BUG
    GDB watch std::string size
    Redis Cluster Lua
    Double Buffer
    Yarn架构
    天池公交客流预测比赛
    hashmap,ConcurrentHashMap与hashtable的区别
    fail-fast和fail-safe
    常见机器学习算法优缺点
  • 原文地址:https://www.cnblogs.com/lifehrx/p/5778395.html
Copyright © 2011-2022 走看看