线程间的通信 共享数据安全问题
2016-11-05 10:41
435 查看
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.线程通信(wait(),notify())
- 线程之间共享数据(两个线程之间使用同一份数据),线程锁要统一,不统一的话会出现线程安全问题
- Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
- 线程安全与共享数据同步
- struts中Action的线程安全与实例变量和静态变量的共享问题
- 多个线程之间共享数据的方式(卖票问题,存取款问题)
- 专业课程设计之客户与服务器程序的同步与通信机制的设计(三)数据共享和线程
- 高级并发编程之 线程范围内安全共享数据(使用Map方式)
- JAVA中关于线程通信安全问题
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- 多个线程之间共享数据的方式(卖票问题,存取款问题)
- java多线程-线程间通信-示例代码-解决安全问题-等待唤醒机制wait()notify()notifyAll()
- 多线程2:线程操作共享数据所引发的问题
- 黑马程序员——java中两个线程对同一个数据做不同操作的安全问题
- 多线程访问共享数据的安全问题
- Java线程同步锁解决共享数据安全
- struts中Action的线程安全与实例变量和静态变量的共享问题
- 求助,关于MFC线程数据共享的问题
- 黑马程序员 学习笔记六:线程间的通信以及通信安全问题
- 高级并发编程学习-线程范围内安全共享数据(使用ThreadLocal方式)