多線程訪問共享對象和數據的方式

要實現多線程訪問共享對象,通常要將有互斥的代碼放在一個類當中。若是多線程中的每一個線程執行的代碼相同,能夠功用一個Runable對象;若是很少線程代碼不一致,則須要用多個Runable對象或者多個Runable實現類。java

一、多線程須要訪問的代碼一致

可用一個Runable實現類來實現,以下:多線程

/**
 * 多線程訪問共享對象和數據的方式 方式一:共享的代碼是同樣的
 * 
 * @author xiao
 *
 */
public class MultiThreadShareData1 {
	public static void main(String[] args) {
		// 對象共享
		ShareData1 data1 = new ShareData1();

		new Thread(data1).start();
		new Thread(data1).start();

	}
}

class ShareData1 implements Runnable {

	private int count = 100;

	@Override
	public void run() {
		while (count > 0) {
			count--;
		}
	}

}

二、多線程須要訪問的代碼不一致

能夠用多個Runable對象或者多個Runable實現類:ide

(1)用多個Runable對象,以下:this

/**
 * 多線程訪問共享對象和數據的方式 
 * 方式二:共享的代碼不同
 * 
 * @author xiao
 *
 */
public class MultiThreadShareData2 {
	public static void main(String[] args) {

		// 第一種方式:在各個線程的中共用一個對象,在各自的run()方法中執行共用對象的不一樣代碼
		final ShareData2 data1 = new ShareData2();
		new Thread(new Runnable() {

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

		new Thread(new Runnable() {

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

	}
}

class ShareData2 {

	private int j = 0;

	public synchronized void increment() {
		j++;
	}

	public synchronized void decrement() {
		j--;
	}

}

(2)使用多個Runable實現類,以下:spa

/**
 * 多線程訪問共享對象和數據的方式
 * 方式二:共享的代碼不同
 * 
 * @author admin
 *
 */
public class MultiThreadShareData3 {
	public static void main(String[] args) {

		// 第二種方式:定義多個Runnable的實現類,而後再不一樣的Runnable實現類中執行公用對象的不一樣代碼
		ShareData3 data3 = new ShareData3();
		new Thread(new MyRunnable1(data3)).start();
		new Thread(new MyRunnable2(data3)).start();

	}
}

class MyRunnable1 implements Runnable {

	private ShareData3 data3;

	public MyRunnable1(ShareData3 data3) {
		this.data3 = data3;
	}

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

}

class MyRunnable2 implements Runnable {

	private ShareData3 data3;

	public MyRunnable2(ShareData3 data3) {
		this.data3 = data3;
	}

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

}

class ShareData3 {

	private int j = 0;

	public synchronized void increment() {
		setJ(getJ() + 1);
	}

	public synchronized void decrement() {
		setJ(getJ() - 1);
	}

	public int getJ() {
		return j;
	}

	public void setJ(int j) {
		this.j = j;
	}

}
相關文章
相關標籤/搜索