zoukankan      html  css  js  c++  java
  • atomic 原子操作的类

    
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * 原子操作的类 atomic
     */
    public class VolatileDemo {
        static AtomicInteger i = new AtomicInteger(0);
        public static class PlusTask implements Runnable {
            @Override
            public void run() {
    //            synchronized (VolatileDemo.class){
                for (int j = 0; j < 10000; j++) {
                    i.incrementAndGet(); //自增
                }
    //            }
            }
        }
    
        public static void main(String[] args) throws InterruptedException{
            Thread[] threads = new Thread[10];
            for (int a = 0; a < 10; a++) {
                threads[a] = new Thread(new PlusTask());
                threads[a].start();
            }
            for (int a = 0; a < 10; a++) {
                threads[a].join();
            }
            System.out.println(i.get());//i的值小于10000
        }
    }
    
    
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * 原子类型中的方法是保证了原子操作,但多个方法之间是没有原子性的
     */
    public class AtomicIntegerDemo implements Runnable{
        private static Integer count = 1;
        private static AtomicInteger atomicInteger = new AtomicInteger();
    
        @Override
        public void run() {
            while (true){
                int c = getCountAtomic();
                System.out.println(c);
                if (c>=5){
                    break;
                }
            }
        }
    
       // private Integer getCountAtomic() {
        private synchronized Integer getCountAtomic() { //改进
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (atomicInteger.get()<5){
                return atomicInteger.incrementAndGet();
            }else {
                return atomicInteger.get();
            }
        }
        public static void main(String[] args){
            AtomicIntegerDemo demo = new AtomicIntegerDemo();
            Thread t1 = new Thread(demo);
            Thread t2 = new Thread(demo);
            t1.start();
            t2.start();
        }
        //1
        //2
        //3
        //4
        //6
        //5
        //会出现6这种现象
        //get方法和incrementAndGet方法都是原子操作,但复合使用时,无法保证原子性,仍旧可能出现数据错误
    }
    
  • 相关阅读:
    bash 教程 shell 基础语法
    使用 Flutter 开发 Windows 桌面应用 [MD]
    小tips:使用babelupgrade从babel6升级babel7
    JS的可选链操作符(?.)与双问号(??),你用到了吗?
    JS处理html的编码(encode)与解码(decode)
    pdf A3 到 A4
    grub4dos 制作U盘启动盘
    amixer的用法
    一个tomcat设置多个端口
    PostgreSQL 配置内存参数
  • 原文地址:https://www.cnblogs.com/fly-book/p/11442613.html
Copyright © 2011-2022 走看看