线程访问共享数据的3种方法

原创 2012年03月29日 19:31:17

方法一:用内部类作为线程,根据内部类可以访问外部类的全部成员的特性将拥有共享数据的类定义为外部类的成员变量或方法中的局部变量,代码如下

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);
		}
	}
}


方法二:将共享数据封装到一个对象,将这个对象传递给多个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);
		}
	}
}


方法三:将共享数据定义为主类的成员变量,将需要同步的方法定义为主类的成员方法,代码如下

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);
	}

}


相关文章推荐

多线程之3-------多个线程访问共享数据的方式

本文先从一个面试题说起: 设计4个线程,其中两个线程每次对  j  +1, 另外两个线程对 j-1,  分析:  这里 j 看作是一个共享数据 从现实例子来看,可以扩展到卖票,假设有100张票, 分5...
  • aduovip
  • aduovip
  • 2012年04月24日 22:53
  • 1682

多个线程访问共享对象和数据的方式-笔记整理5

多个线程之间共享数据的方式探讨 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。 2.如果每个线程...

Thread学习(三)多个线程访问共享对象和数据的方式

1.如果每个线程执行的代码相同,可以使用同一个Runable对象,这个Runable对象中有那个共享数据,例如卖票系统就可以这样做。 2.如果每个线程执行的代码不相同,这个时候需要用到不同的Runa...
  • a347911
  • a347911
  • 2016年11月16日 10:33
  • 449

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

1、将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信。  2...

多线程访问共享数据的安全问题

当多线程访问共享数据的时候,会出现线程安全问题,要解决线程安全问题,就是将操作共享数据的地方加同步锁。保证对操作该共享数据的时候是同步的,就可以解决线程安全问题了。但是因为需要判断锁,需要消耗资源,导...

多线程访问共享数据(2)

上篇博客介绍了不同情况下,多线程访问共享数据的不种解决。本篇博客接着介绍第二种情况(每个线程执行的代码不同)的其他解决方案。    如果每个线程执行的代码不同,这个时候需要用不同的Runnable对...

多线程访问共享数据同步原因

多线程访问共享数据同步的原因

Go并发:访问共享数据

竟险 竟险(竞争条件、Race Condition)是指多个协程(goroutine)同时访问共享数据,其结果取决于指令执行顺序的情况。 考虑如下售票程序。该程序模拟两个售票窗口,一个执行购票,一...

同步访问共享数据【Effective java第10章】

在多线程编程时会涉及到共享数据的问题,以下是个人学习的一个小例子。 import java.math.BigDecimal; import java.util.concurrent.TimeUnit;...

Today Extension 与 Host App 共享数据的3种方法

iOS App之间共享数据的方法主要有三种: Shared User Defaults、Shared Data Container、openURL API。 最近做了一个Today Extension...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程访问共享数据的3种方法
举报原因:
原因补充:

(最多只允许输入30个字)