多线程访问共享对象和数据的方式

要实现多线程访问共享对象,一般要将有互斥的代码放在一个类当中。如果多线程中的每个线程执行的代码相同,可以功用一个Runable对象;如果不多线程代码不一致,则需要用多个Runable对象或者多个Runable实现类。

1、多线程需要访问的代码一致

可用一个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--;
		}
	}

}

2、多线程需要访问的代码不一致

可以用多个Runable对象或者多个Runable实现类:

(1)用多个Runable对象,如下:

/**
 * 多线程访问共享对象和数据的方式 
 * 方式二:共享的代码不一样
 * 
 * @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实现类,如下:

/**
 * 多线程访问共享对象和数据的方式
 * 方式二:共享的代码不一样
 * 
 * @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;
	}

}

猜你喜欢

转载自my.oschina.net/u/3696939/blog/1822108
今日推荐