Java 스레드 동기화는 근본적으로 논리와 일치합니다 : 잠금 추가 -------> 수정 --------> 릴리스 잠금
1. 코드 블록 동기화
예는 다음과 같습니다.
공개 클래스 syncBlock {static class datawrap {int i; } static class syncblockthread 스레드 {private datawrap 날짜; public syncblockthread (datawrap datawrap) {this.date = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {synchronized (date) {date.i ++; 시도 {sleep (1); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println (getName () + "" + date.i); }}}} public static void main (string [] args) {// 멀티 스레드 구현 변수 i 시퀀스에서 하나의 출력을 추가합니다. new SyncBlockThread (datawrap) .start (); new SyncBlockThread (datawrap) .start (); new SyncBlockThread (datawrap) .start (); }}예에서는 정수를 순서대로 출력하려고합니다.
일반적으로 동기 코드 블록은 잠긴 객체이며 일반적으로 동시 액세스가 필요한 공유 리소스입니다. 모든 스레드는 먼저 지정된 리소스를 수정하기 전에 리소스를 잠그십시오. 잠금 기간 동안 다른 스레드는 자원을 수정할 수 없습니다. 이것은 스레드의 보안을 보장합니다. 또한, 스레드는 수면이나 수율을 호출 할 때 자원 잠금 장치를 포기하지 않습니다.
2. 동기화 방법
공개 클래스 syncmethod {static class datawrap {int i; public synchronized void valuegrow () {i ++; try {thread.sleep (1); } catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } system.out.println (Thread.currentThread (). getName () + "" + i); }} 정적 클래스 syncMethodThread는 스레드 {datawrap datawrap; public syncmethodThread (datawrap datawrap) {this.datawrap = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {datawrap.valuegrow (); }}} public static void main (String [] args) {// 순차적 성장 및 출력 구현 I Datawrap Datawrap = New Datawrap (); new SyncMethodThread (datawrap) .start (); new SyncMethodThread (datawrap) .start (); new SyncMethodThread (datawrap) .start (); }}동기화 메소드는 동기화 된 키워드에 의해 수정 된 메소드입니다. 동기화 메소드는 객체 자체를 잠급니다. 따라서 스레드가 특정 객체의 동기화 메소드를 호출 할 때 다른 스레드가 객체의 다른 동기화 방법을 호출하는 경우 객체가 잠겨 있었기 때문에 객체의 잠금을 해제하기 위해 기다려야합니다.
3. 동기식 잠금
동기화 잠금 오브젝트를 정의하여 동기화가 달성되며,이 경우 동기화 잠금은 잠금 객체를 사용하여
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class synclock {static class datawrap {lock lock = new ReentrantLock (); int i; public void valuegrow () {lock.lock (); {i ++; try {thread.sleep (1); } catch (InterruptedException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } system.out.println (Thread.currentThread (). getName () + "" + i); } 마침내 {lock.unlock (); }}} 정적 클래스 synclockthread 스레드 {datawrap datawrap; public synclockthread (datawrap datawrap) {this.datawrap = datawrap; } @override public void run () {for (int i = 0; i <10; i ++) {datawrap.valuegrow (); }}} public static void main (String [] args) {// 순차적 성장 및 출력 구현 I Datawrap Datawrap = New Datawrap (); new SynclockThread (datawrap) .start (); new SynclockThread (datawrap) .start (); new SynclockThread (datawrap) .start (); }}잠금 객체를 사용하여 스레드 동기화를 구현하는 것이 더 유연합니다. 일부 잠금 장치에는 일부 특정 기능이 있으며, 그 중에서도 일반적으로 사용되는 readwritelock read and write locks가 있으며 ReintrantLock은 잠금 장치를 다시 입력 할 수 있습니다.