线程共享方式

‘线程共享数据的方式:通常有两种方式实现;

以一道面试题为例:
“设计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();  
        }  
    }  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值