线程共享方式
2016-07-16 11:05
211 查看
‘线程共享数据的方式:通常有两种方式实现;
以一道面试题为例:
“设计4个线程。,其中两个线程每次对j增加1,另外两个线程对j每次减1“。
第一种解决方案:
此方案简单易懂;将数据抽象成一个类,对这个数据的操作转换成一个类来处理,在方法上加上synchronized 做到了数据的同步。
但是:代码繁琐,需要创建多个类,看起来很不方便。
第二种解决方案:
此方案是:巧妙的使用了内部类共享外部类数据的思想。就是把共享的数据变成全局变量,这样就能保证数据的同步,代码也更加的简洁。
但是不容易理解。
以一道面试题为例:
“设计4个线程。,其中两个线程每次对j增加1,另外两个线程对j每次减1“。
第一种解决方案:
此方案简单易懂;将数据抽象成一个类,对这个数据的操作转换成一个类来处理,在方法上加上synchronized 做到了数据的同步。
但是:代码繁琐,需要创建多个类,看起来很不方便。
//写一个MyData类 public class MyData { private int j=0; public synchronized void add(){ j++; System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j); } public synchronized void dec(){ j--; System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j); } public int getData(){ return j; } }
//实现Runnable接口 public class AddRunnable implements Runnable{ //实例化 MyData data; //构造函数 public AddRunnable(MyData data){ this.data= data; } //调用run方法 public void run() { data.add(); } }
public class DecRunnable implements Runnable { MyData data; public DecRunnable(MyData data){ this.data = data; } public void run() { data.dec(); } }
//测试类 public class Test { public static void main(String[] args) { MyData data = new MyData(); Runnable add = new AddRunnable(data); Runnable dec = new DecRunnable(data); //调用start()开启线程 for(int i=0;i<2;i++){ new Thread(add).start(); new Thread(dec).start(); } }
第二种解决方案:
此方案是:巧妙的使用了内部类共享外部类数据的思想。就是把共享的数据变成全局变量,这样就能保证数据的同步,代码也更加的简洁。
但是不容易理解。
//写一个MyData类 public class MyData { private int j=0; public synchronized void add(){ j++; System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j); } public synchronized void dec(){ j--; System.out.println("线程"+Thread.currentThread().getName()+"j为:"+j); } public int getData(){ return j; } }
//测试类 public class TestThread { public static void main(String[] args) { final MyData data = new MyData(); for(int i=0;i<2;i++){ new Thread(new Runnable(){ public void run() { data.add(); } }).start(); new Thread(new Runnable(){ public void run() { data.dec(); } }).start(); } }
相关文章推荐
- jsp+sclipse+tomcat
- 简单导航
- C语言double和float 实例分析
- POJ 2752 Seek the Name, Seek the Fame
- 摄像头拍照,PHP输入流php://input的使用分析
- C#动态调用WCF接口(2)
- Android开发工具下载网站
- 常量与变量以及在内存中存储形式
- Web基础之httpd服务搭建(一)
- 翻页功能测用例设计
- 做10年Windows程序员与做10年Linux程序员的区别
- hdu 1667 The Rotation Game(2004 Asia Regional Shanghai)
- Summer day 5
- POJ_2488: A Knight's Journey
- c#之回车登录
- 给CentOS6.3 + PHP5.3 安装PHP性能测试工具 XHProf-0.9.2
- [SLAM]2D激光线特征提取
- 用LVS配置一个简单的web LB集群
- 在敏捷测试中如何设计用例
- Barnicle