>  기사  >  Java  >  Java의 Atomic 클래스의 AtomicBoolean

Java의 Atomic 클래스의 AtomicBoolean

(*-*)浩
(*-*)浩앞으로
2019-10-15 17:01:352685검색

Java의 Atomic 클래스의 AtomicBoolean

Classes

java.util.concurrent.atomic 패키지에는 AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference 및 기타 클래스가 있으며 기본 기능은 이러한 클래스 인스턴스에 포함된 메서드를 다중으로 실행하는 것입니다. 스레드 환경은 배타적입니다. 즉, 스레드가 메소드에 들어가서 명령을 실행하면 다른 스레드에 의해 중단되지 않으며 스핀 잠금과 같은 다른 스레드는 메소드 실행이 완료될 때까지 기다립니다. JVM은 대기 대기열에서 이를 제거하고 들어갈 다른 스레드를 선택합니다.

Example

AtomicBoolean을 예로 들어 보겠습니다. 단일 스레드가 다음과 같은 일반적인 메서드를 실행하면 스레딩 문제가 발생하지 않습니다.

package com.secbro.test.atomic;

/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class NormalBoolean implements Runnable{

    public static boolean exits = false;

    private String name;

    public NormalBoolean(String name){
        this.name = name;
    }


    @Override
    public void run() {
        if(!exits){
            exits = true;
            System.out.println(name + ",step 1");
            System.out.println(name + ",step 2");
            System.out.println(name + ",step 3");
            exits = false;
        } else {
            System.out.println(name + ",step else");
        }
    }

    public static void main(String[] args) {
        new NormalBoolean("张三").run();
    }
}

그러나 여러 스레드에 의해 실행될 경우 판단 후 명령을 실행하면 다른 스레드가 종료 값을 삽입하고 변경합니다. 다음 코드 조각에서 볼 수 있듯이:

package com.secbro.test.atomic;
/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class NormalBoolean2 implements Runnable{
    public static boolean exits = false;
    private String name;
    public NormalBoolean2(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 + ",step 1");
            System.out.println(name + ",step 2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + ",step 3");
            exits = false;
        } else {
            System.out.println(name + ",step else");
        }
    }
}

두 개의 스레드를 동시에 실행하고 인쇄된 결과는 다음과 같습니다.

张三,step 1
李四,step 1
张三,step 2
李四,step 2
张三,step 3
李四,step 3

이제 AtomicBoolean을 사용하면 멀티 스레드 상황에서 안전한 작동을 보장할 수 있으며 비즈니스에는 하나의 스레드만 사용됩니다. 처리.

package com.secbro.test.atomic;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public 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 + ",step 1");

            System.out.println(name + ",step 2");

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + ",step 3");
            exits.set(false);
        } else {
            System.out.println(name + ",step else");
        }

    }
}

두 개의 스레드가 이 클래스를 실행하면 인쇄된 결과는 다음과 같습니다.

张三,step else
李四,step 1
李四,step 2
李四,step 3

테스트 클래스:

package com.secbro.test.atomic;
/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class TestBoolean {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new NormalBoolean2("李四"));
        Thread thread2 = new Thread(new NormalBoolean2("张三"));
        thread1.start();
        thread2.start();
        //-------------------------------------------------------
        Thread thread3 = new Thread(new TestAtomicBoolean("李四"));
        Thread thread4 = new Thread(new TestAtomicBoolean("张三"));
        thread3.start();
        thread4.start();
    }
}

위 내용은 Java의 Atomic 클래스의 AtomicBoolean의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제