>Java >java지도 시간 >Java에서 스레드 안전을 구현하는 방법은 무엇입니까?

Java에서 스레드 안전을 구현하는 방법은 무엇입니까?

王林
王林앞으로
2019-11-27 14:55:055521검색

Java에서 스레드 안전을 구현하는 방법은 무엇입니까?

스레드 안전성을 달성하려면 일반적으로 원자성가시성이라는 두 가지 기능이 필요합니다.

구현 방법:

1) 동기화 사용: 원자성과 가시성이 있으므로 동기화 수정 작업을 사용하면 가시성이 있고, 동기화는 비관적을 사용합니다. synchronize:它本具有原子性和可见性的,所以如果使用了synchronize修饰的操作,那么就自带了可见性,synchronized使用悲观锁来实现线程安全;

2)使用原子类代替基本数据类型,原子类是使用乐观锁来实现线程安全,多线程环境下执行a++,可以使用AtomicIntegerincrementAndGet()方法实现,同样是使用了volatile来保证可见性;使用Unsafe调用native本地方法CAS,CAS采用总线加锁或缓存加锁方式来保证原子性;

在线视频教程推荐:java视频教程

3 ) 使用volatile关键字,volatile不一定就有原子性,比如用volatile修饰的变量进行++或者--操作(num++),我们需要让volatile修饰的变量需要具有原子性,那么我们一般可以设置在boolean类型变量上,如下:

volatile boolean tag = true;
线程1 while(tag){};
线程2 while(tag){};

如果有变量自增或者自减,我们可以使用原子类(AtomicInteger)。

4)使用ThreadLocal对各个线程进行隔离;

5)我们还可以用其他的锁,比如重入锁(ReentrantLock

2) 기본 데이터 유형 대신 원자 클래스를 사용합니다. 원자 클래스는 스레드 안전을 달성하기 위해 낙관적 잠금을 사용합니다. AtomicInteger 클래스 <code>incrementAndGet() 메소드 구현은 가시성을 보장하기 위해 휘발성을 사용합니다. Unsafe를 사용하여 기본 로컬 메소드 CAS를 호출합니다. CAS는 버스 잠금 또는 캐시를 사용합니다. 원자성을 보장하기 위한 잠금

추천 온라인 비디오 튜토리얼: Java 비디오 튜토리얼

3) 사용 휘발성 키워드는 휘발성이 반드시 원자성을 가질 필요는 없습니다. 예를 들어, 휘발성 수정 변수를 사용하여 ++ 또는 -- 연산(num++)을 수행하려면 변수를 수정해야 합니다. 원자적이면 일반적으로 다음과 같이 boolean 유형 변수에 설정할 수 있습니다.

rrreee🎜스스로 증가하거나 감소하는 변수가 있는 경우 원자 클래스(AtomicInteger). 🎜🎜4) <code>ThreadLocal을 사용하여 각 스레드를 격리합니다. 🎜🎜5) 스레드 안전을 보장하기 위해 재진입 잠금(ReentrantLock)과 같은 다른 잠금을 사용할 수도 있습니다. 6) 스레드 안전성을 보장하기 위해 임계 섹션, 뮤텍스 및 세마포어를 사용할 수도 있습니다. 🎜🎜이 글은 🎜java 입문 학습🎜 칼럼에서 추천한 글입니다. 누구나 함께 배우고 소통할 수 있습니다. 🎜

위 내용은 Java에서 스레드 안전을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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