스레드 접근 공유 데이터의 3가지 방법

2856 단어 다중 스레드
방법1: 내부 클래스를 라인으로 하고 내부 클래스가 외부 클래스에 접근할 수 있는 모든 구성원의 특성에 따라 공유 데이터를 가진 클래스를 외부 클래스의 구성원 변수나 방법 중의 국부 변수로 정의한다. 코드는 다음과 같다.
public class MultiThread {
	private static ShareData data = new ShareData();

	public static void main(String[] args) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				data.decrement();
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				data.increment();
			}
		}).start();
	}

}

class ShareData {
	private int j = 0;

	public synchronized void increment() {
		for (int i = 0; i < 100; i++) {
			j++;
			System.out.println(Thread.currentThread().getName() + ":" + j);
		}
	}

	public synchronized void decrement() {
		for (int i = 0; i < 100; i++) {
			j++;
			System.out.println(Thread.currentThread().getName() + ":" + j);
		}
	}
}

방법2: 공유 데이터를 한 대상에 봉하여 이 대상을 여러 개의 Runnable 대상에게 전달하고 각 라인이 공유 데이터에 대한 조작 방법도 그 대상에게 분배하여 완성한다. 그러면 이 데이터에 대한 각 조작의 상호 배척과 통신을 실현하기 쉽다. 코드는 다음과 같다.
public class MultiThread {
	public static void main(String[] args) {
		final ShareData data = new ShareData();
		new Thread(new MyRunnable1(data)).start();
		new Thread(new MyRunnable2(data)).start();
	}

}

class MyRunnable1 implements Runnable {
	private ShareData data;

	public MyRunnable1(ShareData data) {
		this.data = data;
	}

	@Override
	public void run() {
		data.decrement();
	}
}

class MyRunnable2 implements Runnable {
	private Sharedata data;

	public MyRunnable2(Sharedata data) {
		this.data = data;
	}

	@Override
	public void run() {
		data.increment();
	}
}

class Sharedata {
	private int j = 0;

	public synchronized void increment() {
		for (int i = 0; i < 100; i++) {
			j++;
			System.out.println(Thread.currentThread().getName() + ":" + j);
		}
	}

	public synchronized void decrement() {
		for (int i = 0; i < 100; i++) {
			j--;
			System.out.println(Thread.currentThread().getName() + ":" + j);
		}
	}
}

방법3: 공유 데이터를 주류의 구성원 변수로 정의하고 동기화가 필요한 방법을 주류의 구성원 방법으로 정의한다. 코드는 다음과 같다.
public class MultiThread {
	private int j;

	public static void main(String[] args) {
		MultiThread mt = new MultiThread();
		Dec dec = mt.new Dec();
		Inc inc = mt.new Inc();
		new Thread(inc).start();
		new Thread(dec).start();
	}

	class Dec implements Runnable {
		@Override
		public void run() {
			for (int i = 0; i < 100; i++) {
				decrement();

			}
		}
	}

	class Inc implements Runnable {
		@Override
		public void run() {
			for (int i = 0; i < 100; i++) {
				increment();
			}
		}
	}

	public synchronized void increment() {
		j++;
		System.out.println(Thread.currentThread().getName() + ":" + j);
	}

	public synchronized void decrement() {
		j--;
		System.out.println(Thread.currentThread().getName() + ":" + j);
	}

}

좋은 웹페이지 즐겨찾기