> Java > java지도 시간 > Java의 Atomic 클래스의 AtomicBoolean

Java의 Atomic 클래스의 AtomicBoolean

(*-*)浩
풀어 주다: 2019-10-15 17:01:35
앞으로
2751명이 탐색했습니다.

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿