题目要求:

有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?

分析:

x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。

所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。

如果每个线程执行的代码不同,肯定需要不用的Runnable对象,有两种方式实现这些不同的Runnable对象之间的数据共享:

第一种:将共享数据封装到一个对象中,把这个共享数据所在的对象传递给不同的Runnable,每个线程对共享数据的操作也分给那个

对象完成,这样就可以实现对该数据处理的互斥与通信。

class ShareData {

private int x = 0;

public synchronized void addx(){

x++;

System.out.println("x++ : "+x);

}

public synchronized void subx(){

x--;

System.out.println("x-- : "+x);

}

}

class MyRunnable1 implements Runnable{

private ShareData share1 = null;

public MyRunnable1(ShareData share1) {

this.share1 = share1;

}

public void run() {

for(int i = 0;i<100;i++){

share1.addx();

}

}

}

class MyRunnable2 implements Runnable{

private ShareData share2 = null;

public MyRunnable2(ShareData share2) {

this.share2 = share2;

}

public void run() {

for(int i = 0;i<100;i++){

share2.subx();

}

}

}

public class ThreadsVisitData {

public static void main(String[] args) {

ShareData share = new ShareData();

new Thread(new MyRunnable1(share)).start();

new Thread(new MyRunnable2(share)).start();

}

}

第二种:

将这些Runnable对象作为某一个类的内部类,共享的数据作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作

class ShareData {

private int x = 0;

public synchronized void addx(){

x++;

System.out.println("x++ : "+x);

}

public synchronized void subx(){

x--;

System.out.println("x-- : "+x);

}

}

public class ThreadsVisitData {

public static ShareData share = new ShareData();

public static void main(String[] args) {

//final ShareData share = new ShareData();

new Thread(new Runnable() {

public void run() {

for(int i = 0;i<100;i++){

share.addx();

}

}

}).start();

new Thread(new Runnable() {

public void run() {

for(int i = 0;i<100;i++){

share.subx();

}

}

}).start();

}

}

总结:要同步互斥的代码任务最好将他们分别放在独立的方法中,这些方法再放在同一个类中,这样比较容易实现操作的同步和通信。

Java shared data_Java多个线程之间处理共享数据的方式相关推荐

  1. Java高并发编程:线程范围内共享数据

    笔记摘要 所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Threa ...

  2. 保护线程间的共享数据

    程序员的自我修养(六):保护线程间的共享数据 多进程和多线程最本质的区别在于共享和隔离的程度不同.对于多进程方式来说,因为隔离程度高,所以程序员很少需要去担心进程空间的数据被破坏:但是并发任务之间共享 ...

  3. java 多线程 共享数据_JAVA多线程提高四:多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  4. JAVA 并发编程-多个线程之间共享数据(六)

    多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做. 2,如果每个线程执行的代码不同,这时 ...

  5. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

  6. 多线程学习(四)-线程范围内共享数据

    一:线程范围内共享数据: 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这时候需要 ...

  7. java 线程 静态变量_线程之间是否共享静态变量?

    问题 我的老师在一个关于线程的上层java课上说了一些我不确定的东西. 他表示以下代码不一定会更新2910104598变量.根据他的说法,两个线程不一定共享静态变量,特别是在每个线程(主线程与Read ...

  8. Java高并发编程:多个线程之间共享数据的方式探讨

    内容摘要 多个线程之间共享数据,按照每个线程执行代码是否相同,我们可以采取不同的处理方式,这里通过简单的卖票示例说明了当每个线程执行相同代码的情况,对于多个线程执行不同代码的情况,处理方式比较灵活,这 ...

  9. Java 编程下的并发线程之间的同步代码块死锁

    并发线程之间的死锁通常发生在同步代码块的相互嵌套使用的过程中,下面先来看段代码: package cn.sunzn.synchronize;public class DeadLock {public ...

最新文章

  1. Ansible免密码登陆
  2. Python上下文语法with小述
  3. LAMP(linux下apache+mysql+php)平台编译安装的实现
  4. RDA PQ工具使用 (Adi Analysis)
  5. 不借助任何变量进行变量交换
  6. 服务器磁盘扩展容量操作流程
  7. 编程学习记录11:Oracle数据库的一些基本操作1,创建用户,授权
  8. iOS多线程编程--NSOperation(转)
  9. 【Java】菜鸟教程Java基础测试刷题笔记
  10. 【项目实战】课程管理系统(SpringBoot+mybatis-plus+Vue)
  11. VM14装deepin-15.6-amd64
  12. 蓝湖 Figma 插件被下架了怎么办?蓝湖的替代品列表
  13. ffmpeg转换视频编码
  14. python轻松生成pdf文档
  15. 实时数仓实践(一)之数据库实时增量同步工具-CDC(Change Data Capture)
  16. 74cms|骑士cms|开源招聘系统,数据结构
  17. 微信公众号如何上传PPT?
  18. 从玉农业谋定国家龙头企业-林裕豪:对话农民丰收节交易会
  19. 创意竖版产品发布会快闪PPT,等你来拿!
  20. 区分定理(Theorem)、引理(Lemma)、推论(Corollary)等概念

热门文章

  1. matlab 报错 保留变量,matlab中明明定义了函数变量总是报错
  2. 基于Mirai搭建QQ机器人监控B站直播
  3. 基于Filebeat自动收集Kubernetes日志的分析系统
  4. 如何用计算机编辑游戏,编辑教你用iPad玩转电脑游戏之RPG篇
  5. PyQt5随笔:给PyQt5 界面添加右键菜单
  6. 流(flow)、庞加莱(Poincare)映射、周期轨道
  7. (一)永磁同步电机矢量控制(三电平)——浅谈三电平逆变器
  8. mysql支持表情输入_mysql支持emoji表情
  9. ie加载项存在残留是什么_Win7系统遇到IE加载项故障的原因及两种解决办法
  10. 【译】教你用50种语言写Hello, World