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

1、将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个操作的互斥和通信。 
2、将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。 
上面两种方式的组合:将共享数据封装在另外一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上去完成,对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的成员内部类或局部内部类。 
总之,要同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样比较容易实现它们之间的同步互斥和通信。 

标签: <无>

代码片段(2)[全屏查看所有代码]

1. [文件] ThreadShareDataTest.java ~ 1KB     下载(13)     

01 package cn.itcast.gz;
02  
03 public class ThreadShareDataTest {
04       
05     public static void main(String[] args) {
06          
07         ShareData shareData = new ShareData();
08          
09         Add add = new Add(shareData);
10         Sub sub = new Sub(shareData);
11          
12         Thread t1 = new Thread(add);
13         Thread t2 = new Thread(add);
14         Thread t3 = new Thread(sub);
15         Thread t4 = new Thread(sub);
16          
17         t1.start();
18         t2.start();
19         t3.start();
20         t4.start();
21     }
22 }
23  
24  
25 class ShareData
26 {
27     private Integer j=100;
28      
29     public synchronized void add()
30     {
31         j++;
32         System.out.println(Thread.currentThread().getName()+" 对j进行加法运算   "+j);
33     }
34      
35     public synchronized  void sub()
36     {
37         j--;
38         System.out.println(Thread.currentThread().getName()+"  对j进行减法运算  "+j);
39     }
40 }
41  
42  
43 class Add implements Runnable
44 {
45  
46     private ShareData data;
47     public Add(ShareData data)
48     {
49         this.data = data;
50     }
51     @Override
52     public void run() {
53         data.add();
54     }
55 }
56  
57 class Sub implements Runnable
58 {
59     private ShareData data;
60     public Sub(ShareData data)
61     {
62         this.data = data;
63     }
64     @Override
65     public void run() {
66          
67         data.sub();
68     }
69 }

2. [文件] ThreadShareDataTest2.java ~ 853B     下载(12)     跳至 [1] [2] [全屏预览]

01 package cn.itcast.gz;
02  
03 public class ThreadShareDataTest2 {
04  
05      public static void main(String[] args) {
06          
07           
08          final ShareData2 shareData = new ShareData2();
09           
10          for(int i = 0;i<2;i++)
11          {
12              new Thread()
13              {
14                  @Override
15                 public void run() {
16                      shareData.add();
17                 }
18              }.start();
19          }
20           
21           
22          for(int i = 0;i<2;i++)
23          {
24              new Thread()
25              {
26                  @Override
27                 public void run() {
28                      shareData.sub();
29                  }
30              }.start();
31          }
32           
33     }
34 }
35  
36 class ShareData2
37 {
38     private Integer j = 100;
39     public  synchronized void add()
40     {
41         j++;
42         System.out.println(Thread.currentThread().getName()+"  对j进行加法运算    "+j);
43     }
44      
45     public  synchronized void sub()
46     {
47         j--;
48         System.out.println(Thread.currentThread().getName()+"  对j进行减法运算   "+j);
49     }
50 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值