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

author author     2022-08-11     613

关键词:

 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.  使用同一把锁

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

技术分享

 

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

技术分享

进程间的数据共享进程池的回调函数和线程初识守护线程(代码片段)

一、进程的数据共享进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的虽然进程间数据独立,但可以通过Manager实现数据共享。把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在... 查看详情

进程通信概念简介多线程上篇

进程通信指的是进程间的信息交换,IPC(Inter-ProcessCommunication,进程间通信)之前说到:进程通信就相当于一种工作方式、沟通形式,比如你给我一个SVN标签号并且告知我意图,我去库中检索指定标签修改的指定内容,就完成了... 查看详情

进程间的通信-队列/管道以及进程间的数据共享和进程池(代码片段)

1.进程之间的通信  1)队列*****  2)管道***2 进程之间的数据共享*3 进程池*****   进程间通信IPC(Inter-ProcessCommunication)进程的概念:创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间... 查看详情

个人笔记--多线程(安全和通信)(代码片段)

线程安全问题:由于多个线程在操作共享数据,且多条语句对共享数据进行运算,所以产生了多线程安全问题,从而有了同步代码块。同步的前提:至少两个线程。必须保证是使用同一个锁。补充:多次start()同一个线程是非法... 查看详情

进程间的几种通信方式的比较和线程间的几种

...的通信。(2)信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步。他常作为一种锁机制。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。... 查看详情

java并发编程之线程安全线程通信

Java多线程开发中最重要的一点就是线程安全的实现了。所谓Java线程安全,可以简单理解为当多个线程访问同一个共享资源时产生的数据不一致问题。为此,Java提供了一系列方法来解决线程安全问题。synchronizedsynchronized用于同步... 查看详情

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

线程间的通信、同步方式与进程间通信方式说到线程之间通信方式:依据我的理解主要是有两种吧 1.是通过共享变量,线程之间通过该变量进行协作通信; 2.通过队列(本质上也是线程间共享同一块内存)来实现消费者... 查看详情

java面试

1.java多线程1.1--java多线程通信?多线程并发编程时,难免会遇到线程间的通信问题。线程通信方式的思想大体上来说可以分为两种:共享和传递。共享的实现方式可以是共享变量、共享文件、数据库、网络等。传递的实现方式可... 查看详情

windows进程间的通信(代码片段)

一、进程与进程通信   进程间通信(Interprocess Communication, IPC)是指不同的进程之间进行数据共享和数据交换。 二、进程间通信方式    1. 文件映射    注:文件映射是在多个进程间共享数据的... 查看详情

线程间的通信--等待唤醒机制

1.多个线程操作相同的资源,但是操作动作不同,所以存在安全问题例如:publicclassTest{publicstaticvoidmain(String[]args){Resourcer=newResource();Inputin=newInput(r);Outputout=newOutput(r);Threadtin=newThread(in);Threadtout=newThread(out 查看详情

进程通信,线程通信,同步方式

一、进程间通信进程间的通信,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信... 查看详情

进程间通信和线程间通信

...访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。消息队列(messagequeue)消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节... 查看详情

线程间的通信方式以及线程与进程的区别

...并发修改的方法。    1.2读写锁:允许多个线程同时读共享数据,而对写操作互斥。    1.3条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的... 查看详情

尚硅谷juc高并发编程学习笔记线程通信与集合线程安全(代码片段)

一、线程间通信线程间通信的模型有两种:共享内存和消息传递线程间的通信具体步骤:(涉及上中下部)1、创建资源类,在资源类中船舰属性和操作方法2、在资源类操作方法:判断、操作、通知3、创建... 查看详情

线程共享数据的安全问题

加同步代码:加了同步代码后,线程进同步判断锁,获取锁,出同步释放锁,导致了线程运行速度的下降方式一:同步代码块  解决线程安全问题,java程序提供了线程同步技术  synchronized(任意对象)    线程要操作的共... 查看详情

线程---1(代码片段)

带着问题去思考!大家好介绍线程之前,我们先了解下线程管理。首先,线程管理是操作系统的核心。为什么要引入线程,什么是线程及进程由什么组成,进程是如何解决问题的?在多道程序环境下,允许多个程序并发执行,此... 查看详情

多线程安全问题

------------恢复内容开始------------一、线程中安全问题产生的原因。1、多个线程在操作共享数据。2、操作共享数据的线程代码有多条。当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会导致线程安全... 查看详情

线程间的通讯(代码片段)

...费了。这里需要考虑两个问题面向这个demo时候,第一是线程的安全问题,第二是通讯问题,你一下,我一下1packagecom.thread;2//定义一个共享的数据3classUser4publicStringname;5publicStrin 查看详情