栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Atomic+Volatile实现买票安全

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Atomic+Volatile实现买票安全

我们直接上例子,用atomic保证变量的原子性,用volatile保证变量的可见性与有序性, 至此并发的三大特性都被有效的解决了,故而就不会存在线程安全问题了

public class SelltickrtDemo {

    public static void main(String[] args) {

        SellTicket sellTicket = new SellTicket();

        Thread thread1 = new Thread(sellTicket, "窗口1");
        Thread thread2 = new Thread(sellTicket, "窗口2");
        Thread thread3 = new Thread(sellTicket, "窗口3");


        thread1.start();
        thread2.start();
        thread3.start();
    }
}

 

import java.util.concurrent.atomic.AtomicInteger;

public class SellTicket implements Runnable {

    private volatile AtomicInteger ticket = new AtomicInteger(100);

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (ticket.get() > 0) {
                System.out.println(Thread.currentThread().getName() + "正在出售第" + ticket.getAndDecrement() + "张票");
            }
        }
    }
}

窗口3正在出售第99张票
窗口1正在出售第98张票
窗口2正在出售第100张票
窗口2正在出售第97张票
窗口3正在出售第95张票
窗口1正在出售第96张票
窗口2正在出售第94张票
窗口3正在出售第93张票
窗口1正在出售第92张票
窗口2正在出售第91张票
窗口1正在出售第90张票
窗口3正在出售第89张票
窗口2正在出售第88张票
窗口3正在出售第87张票
窗口1正在出售第86张票
窗口1正在出售第85张票
窗口3正在出售第84张票
窗口2正在出售第83张票
窗口3正在出售第82张票
窗口2正在出售第81张票
窗口1正在出售第80张票
窗口2正在出售第79张票
窗口3正在出售第78张票
窗口1正在出售第77张票
窗口1正在出售第76张票
窗口2正在出售第75张票
窗口3正在出售第74张票
窗口2正在出售第72张票
窗口3正在出售第71张票
窗口1正在出售第73张票
窗口3正在出售第69张票
窗口2正在出售第68张票
窗口1正在出售第70张票
窗口3正在出售第67张票
窗口2正在出售第65张票
窗口1正在出售第66张票
窗口3正在出售第64张票
窗口1正在出售第63张票
窗口2正在出售第62张票
窗口3正在出售第61张票
窗口1正在出售第60张票
窗口2正在出售第59张票
窗口1正在出售第57张票
窗口3正在出售第58张票
窗口2正在出售第56张票
窗口1正在出售第55张票
窗口2正在出售第54张票
窗口3正在出售第53张票
窗口3正在出售第52张票
窗口2正在出售第51张票
窗口1正在出售第50张票
窗口2正在出售第49张票
窗口1正在出售第47张票
窗口3正在出售第48张票
窗口3正在出售第46张票
窗口1正在出售第45张票
窗口2正在出售第44张票
窗口2正在出售第43张票
窗口1正在出售第42张票
窗口3正在出售第41张票
窗口1正在出售第39张票
窗口3正在出售第38张票
窗口2正在出售第40张票
窗口2正在出售第37张票
窗口3正在出售第36张票
窗口1正在出售第35张票
窗口1正在出售第33张票
窗口3正在出售第32张票
窗口2正在出售第34张票
窗口2正在出售第31张票
窗口3正在出售第30张票
窗口1正在出售第29张票
窗口3正在出售第28张票
窗口2正在出售第26张票
窗口1正在出售第27张票
窗口1正在出售第24张票
窗口2正在出售第23张票
窗口3正在出售第25张票
窗口1正在出售第22张票
窗口3正在出售第21张票
窗口2正在出售第20张票
窗口2正在出售第19张票
窗口1正在出售第18张票
窗口3正在出售第17张票
窗口2正在出售第15张票
窗口1正在出售第16张票
窗口3正在出售第14张票
窗口1正在出售第13张票
窗口3正在出售第12张票
窗口2正在出售第11张票
窗口2正在出售第10张票
窗口3正在出售第9张票
窗口1正在出售第8张票
窗口3正在出售第6张票
窗口2正在出售第5张票
窗口1正在出售第7张票
窗口3正在出售第4张票
窗口1正在出售第3张票
窗口2正在出售第2张票
窗口2正在出售第1张票

接下来我们看看synchronized 锁,其实在JDK的源码中,JVM的底层维护了两个底层命令lock和unlock用来加锁和释放锁,对 对象头 进行加锁,运行下面这段代码就会发现上面的时间需要少些,而synchronized是按100规规矩矩减到1,从一定程度上遏制了“并发”,锁的粒度要大于CAS锁机制。

package threadSafe.sellticket;

public class SellTicket implements Runnable {

//    private volatile AtomicInteger ticket = new AtomicInteger(100);
      private int ticket = 100;
    @Override
    public void run() {
        while (true) {
            synchronized (this){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "正在出售第" + ticket+ "张票");
                    ticket--;
                }
            }
        }
    }
}

 窗口1正在出售第100张票
窗口2正在出售第99张票
窗口3正在出售第98张票
窗口3正在出售第97张票
窗口2正在出售第96张票
窗口1正在出售第95张票
窗口1正在出售第94张票
窗口2正在出售第93张票
窗口3正在出售第92张票
窗口3正在出售第91张票
窗口2正在出售第90张票
窗口1正在出售第89张票
窗口2正在出售第88张票
窗口3正在出售第87张票
窗口2正在出售第86张票
窗口1正在出售第85张票
窗口2正在出售第84张票
窗口3正在出售第83张票
窗口2正在出售第82张票
窗口2正在出售第81张票
窗口2正在出售第80张票
窗口2正在出售第79张票
窗口1正在出售第78张票
窗口2正在出售第77张票
窗口2正在出售第76张票
窗口2正在出售第75张票
窗口2正在出售第74张票
窗口2正在出售第73张票
窗口3正在出售第72张票
窗口2正在出售第71张票
窗口2正在出售第70张票
窗口2正在出售第69张票
窗口2正在出售第68张票
窗口2正在出售第67张票
窗口1正在出售第66张票
窗口2正在出售第65张票
窗口2正在出售第64张票
窗口3正在出售第63张票
窗口2正在出售第62张票
窗口2正在出售第61张票
窗口2正在出售第60张票
窗口1正在出售第59张票
窗口1正在出售第58张票
窗口1正在出售第57张票
窗口1正在出售第56张票
窗口2正在出售第55张票
窗口2正在出售第54张票
窗口2正在出售第53张票
窗口2正在出售第52张票
窗口2正在出售第51张票
窗口3正在出售第50张票
窗口3正在出售第49张票
窗口3正在出售第48张票
窗口2正在出售第47张票
窗口1正在出售第46张票
窗口1正在出售第45张票
窗口2正在出售第44张票
窗口3正在出售第43张票
窗口3正在出售第42张票
窗口3正在出售第41张票
窗口3正在出售第40张票
窗口2正在出售第39张票
窗口1正在出售第38张票
窗口1正在出售第37张票
窗口1正在出售第36张票
窗口2正在出售第35张票
窗口2正在出售第34张票
窗口2正在出售第33张票
窗口3正在出售第32张票
窗口2正在出售第31张票
窗口2正在出售第30张票
窗口2正在出售第29张票
窗口2正在出售第28张票
窗口1正在出售第27张票
窗口1正在出售第26张票
窗口1正在出售第25张票
窗口1正在出售第24张票
窗口1正在出售第23张票
窗口2正在出售第22张票
窗口2正在出售第21张票
窗口3正在出售第20张票
窗口3正在出售第19张票
窗口3正在出售第18张票
窗口3正在出售第17张票
窗口3正在出售第16张票
窗口2正在出售第15张票
窗口1正在出售第14张票
窗口1正在出售第13张票
窗口1正在出售第12张票
窗口2正在出售第11张票
窗口2正在出售第10张票
窗口3正在出售第9张票
窗口3正在出售第8张票
窗口2正在出售第7张票
窗口1正在出售第6张票
窗口2正在出售第5张票
窗口2正在出售第4张票
窗口3正在出售第3张票
窗口2正在出售第2张票
窗口2正在出售第1张票 

后期我会慢慢优化这个内容,精益求精,也希望大家多多批评指正,共同完善! 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769893.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号