线程间的通信 共享数据安全问题

 1 //线程间的通信:线程的任务不同,但是线程操作的数据相同。
 2
 3 //描述数据
 4 class Resource
 5 {
 6     public String name;
 7     public String gender;
 8     public Resource(){}
 9 }
10
11 //描述输入任务
12 class Input implements Runnable
13 {
14     private Resource res;
15     public Input(Resource res)
16     {
17         this.res = res;
18     }
19     public void run()
20     {
21         int i = 1;
22         while(true)
23         {
24             synchronized(res)       //加同步锁①
25             {
26                 if(i==1)
27                 {
28                     res.name = "猪小明";
29                     res.gender = "男";
30                 }
31                 else
32                 {
33                     res.name = "腿腿";
34                     res.gender = "女";
35                 }
36                 i=(++i)%2;
37             }
38         }
39     }
40 }
41
42 //描述输出任务
43 class Output implements Runnable
44 {
45     private Resource res;
46     public Output(Resource res)
47     {
48         this.res = res;
49     }
50     public void run()
51     {
52         while(true)
53         {
54             synchronized(res)      //加同步锁②,①处和此处为同一把锁!
55             {
56                 System.out.println(res.name + "....." + res.gender);
57             }
58         }
59     }
60 }
61
62 class Test
63 {
64     public static void main(String[] args)
65     {
66         //创建资源
67         Resource res = new    Resource();
68         //创建输入任务
69         Input input = new Input(res);
70         //创建输出任务
71         Output output = new Output(res);
72         //创建输入线程
73         Thread t1 = new Thread(input);
74         //创建输出线程
75         Thread t2 = new Thread(output);
76         //启动线程
77         t1.start();
78         t2.start();
79
80     }
81 }

 同步的两个基本要求:

  1.  至少有两个线程
  2.  使用同一把锁

如果不使用同步,将会出现如下错误:

使用同步后,错误不再出现:

时间: 2024-08-09 15:27:21

线程间的通信 共享数据安全问题的相关文章

线程(二)__线程间的通信

线程间的通信:多个线程在处理同一资源,但是任务却不同.一.等待唤醒机制涉及的方法:1.wait();让线程处于冻结状态,被wait的线程会被存储到线程池中2.notify();唤醒线程池中的一个任意线程3.notifyAll();唤醒线程池中的所有线程这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法,必须要明确到底操作的是哪个锁上的线程wait()对A锁上面的线程进行操作后只能用A锁的notify来唤醒.被wait之后的线程可认为放在线程池中. 为什么操作线程的方法wait no

VC++多线程编程-线程间的通信和线程同步

引用:http://blog.csdn.net/zjc0888/article/details/7372258 线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明. 使用全局变量进行通信 由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量.对于标准类型

Java基础教程:多线程基础(2)——线程间的通信

Java基础教程:多线程基础(2)--线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 思维导图 等待中 等待/通知机制 不使用等待/通知机制 我们可以使用使用sleep()与 whle(true) 死循环来实现多个线程间的通信. 虽然两个线程实现了通信,但是线程B必须不断的通过while语句轮训机制来检测某一个条件,这样会浪费CPU资源. 如果轮询间隔较小,更浪费时间间隔.如果轮训

线程间的通信、同步方式与进程间通信方式

1.线程间的通信方式 1)使用全局变量(由于多个线程可能更改全局变量,因此全局变量最好声明为volatile) 2) 使用消息实现通信 3)使用事件CEvent类实现线程间的通信 2.同步/异步(C端) 同步:在C端发出一个功能调用时,没有得到结果之前就不返回 异步: 一个请求通过事件触发后,得到服务器处理后才处理完毕 3. 阻塞/非阻塞(S端) 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行).函数只有在得到

网络开始---多线程---线程间的通信(掌握)(五)

1 #import "HMViewController.h" 2 3 @interface HMViewController () 4 @property (weak, nonatomic) IBOutlet UIImageView *imageView; 5 @end 6 7 @implementation HMViewController 8 9 - (void)viewDidLoad 10 { 11 [super viewDidLoad]; 12 // Do any additi

iOS多线程技术—线程间的通信

iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SE

iOS开发多线程篇—线程间的通信

iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SE

线程间的通信的几种方式

线程间的通信: - 什么叫做线程间通信 - 在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 - 线程间通信的体现 - 1个线程传递数据给另1个线程 - 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 - 线程间通信常用方法 - 方法一:利用perform的方式 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)

第一篇:线程间的通信

  1.线程间的通信:在一个进程中,线程往往不是独立存在的,多个线程之间需要经常进行通信. 2.线程间通信的体现: 一个线程传递数据给另一个线程 在一个线程执行完特定任务后,转到另一个线程继续执行任务 3.线程间通信常用方法: —(void)performSelectorOnMainThread:(SEL)aselector  withObject:(id)arg waitUntilDone:(BOOL)wait; —(void)performSelector:(SEL)aselector on