线程访问共享数据的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);
	}

}


移动端适配方案(下)

上一篇介绍了像素和视口这些基本概念,现在接着移动端的适配方案。 推荐一篇文章:MobileWeb适配总结,里面说到的三种布局方法已经说的很详细,还分别做了demo,我就不做了,这里说说三种方案的...
  • fairyier
  • fairyier
  • 2016年04月06日 16:36
  • 752

移动端字体大小适配

接下来是个人的理解,网上的资料太杂太乱,得细心看才能找到精华。 css3字体有了“rem”单位,来解决屏幕适配问题。 它与px的区别:px设置了字体大小就不可变,rem是可以根据根元素html的字...
  • Iamgoodgilr
  • Iamgoodgilr
  • 2016年10月17日 13:48
  • 684

Arcgis10.1 3种方法快速制作tpk文件 .

目录(?)[-] 使用ArcMap制作tpk使用GP工具制作tpk使用已有的紧凑型切片制作tpk Tpk文件的组成制作thumbnail缩略图生成itempkinfo文件生成iteminf...
  • u011116642
  • u011116642
  • 2014年02月13日 14:53
  • 801

AFNetworking 3 批量上传图片的 3 种方法

AFNetworking 在去年年底升级到了 3.0。这个版本更新想必有很多好处,然而让我吃惊的是,它并没有 batch request 接口。之前的 1.x 版本、2.x 版本都实现了这个很常见的需...
  • qq_30513483
  • qq_30513483
  • 2016年05月16日 11:26
  • 2213

Nginx防盗链的3种方法

一:一般的防盗链如下: location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jzxue.com jzxu...
  • mecho
  • mecho
  • 2015年07月21日 11:28
  • 1684

Android 定时器的3种方法

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net  ...
  • luckkof
  • luckkof
  • 2014年02月07日 16:35
  • 787

运行的Cython的3种方法

第一种: fib.pyx def fib(long n): '''Returns the nth Fibonacci number.''' cdef long a=0, b=1, i ...
  • appleyuchi
  • appleyuchi
  • 2017年11月14日 15:32
  • 45

Java读写文件的几种方法

原文:Java读写文件的几种方法import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileRea...
  • nickwong_
  • nickwong_
  • 2016年05月25日 23:21
  • 924

使程序暂停的3种方法

常见的3种能让程序在运行时调试时暂停,按任意键继续的方法: getch(); 所在头文件:conio.h (conio是Console Input/Output(控制台输入输出)的简...
  • Jaen_tail
  • Jaen_tail
  • 2015年09月20日 13:15
  • 7674

Nginx防盗链的3种方法

一般常用的方法是在server或者location段中加入! valid_referers   none  blocked  www.yiibase.com yiibase.com; 详见下面...
  • PHPService
  • PHPService
  • 2014年08月20日 20:32
  • 520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程访问共享数据的3种方法
举报原因:
原因补充:

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