您的位置:首页 > 其它

线程共享方式

2016-07-16 11:05 211 查看
‘线程共享数据的方式:通常有两种方式实现;

以一道面试题为例:

“设计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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: