Java类之AtomicBoolean

来源:互联网 发布:钱咖淘宝返利 编辑:程序博客网 时间:2024/05/16 15:48

概述

在Java.util.concurrent.atomic包下,有AtomicBoolean , AtomicInteger, AtomicLong, AtomicReference等类,它们的基本特性就是在多线程环境下,执行这些类实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入。

举例说明

普通的Boolean

package com.example;import java.util.concurrent.atomic.AtomicBoolean;public class MyClass{    public static void main(String[] args)    {        Thread thread1 = new Thread(new CommonBoolean("普通线程一"));        Thread thread2 = new Thread(new CommonBoolean("普通线程二"));        thread1.start();        thread2.start();    }    private static class CommonBoolean implements Runnable{        public static boolean exits = false;        private String name;        public CommonBoolean(String name)        {            this.name = name;        }        @Override        public void run()        {            if(!exits){                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                exits = true;                System.out.println(name + ",执行了!");                System.out.println(name + ",执行了!");                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(name + ",执行了!");                exits = false;            }        }    }}

打印结果:

这里写图片描述

AtomicBoolean

package com.example;import java.util.concurrent.atomic.AtomicBoolean;public class MyClass{    public static void main(String[] args)    {        Thread thread3 = new Thread(new TestAtomicBoolean("特殊线程三"));        Thread thread4 = new Thread(new TestAtomicBoolean("特殊线程四"));        thread3.start();        thread4.start();    }    public static class TestAtomicBoolean implements Runnable{        public static AtomicBoolean exits = new AtomicBoolean(false);        private String name;        public TestAtomicBoolean(String name) {            this.name = name;        }        @Override        public void run() {            if(exits.compareAndSet(false,true)){                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(name + ",执行了!");                System.out.println(name + ",执行了!");                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(name + ",执行了!");                exits.set(false);            }        }    }}

执行结果:

这里写图片描述

0 0