简单的总结一下多线程共享数据的方式。其实,最重要的,是一个思想,一个面向对象的编程思想的建立。

说两点:

一、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。

/**

* 卖票处理

* @author yang

*/

public class SellTicket {

//卖票系统,多个窗口的处理逻辑是相同的

public static void main(String[] args) {

Ticket t = new Ticket();

new Thread(t).start();

new Thread(t).start();

}

}

/**

* 将属性和处理逻辑,封装在一个类中

* @author yang

*/

class Ticket implements Runnable{

private int ticket = 10;

public synchronized void run() {

while(ticket>0){

ticket--;

System.out.println("当前票数为:"+ticket);

}

}

}

打印结果:

当前票数为:9

当前票数为:8

当前票数为:7

当前票数为:6

当前票数为:5

当前票数为:4

当前票数为:3

当前票数为:2

当前票数为:1

当前票数为:0

二,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计2个线程。一个线程对j增加1,另外一个线程对j减1,银行存取款。

/**

* 一个线程加1,一个线程减1

* @author yang

*/

public class MultiThreadShareData {

public static void main(String[] args) {

ShareData data = new ShareData();

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

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

}

}

class MyRunnable1 implements Runnable {

private ShareData data;

public MyRunnable1(ShareData data) {

this.data = data;

}

public void run() {

data.decrement();

}

}

class MyRunnable2 implements Runnable {

private ShareData data;

public MyRunnable2(ShareData data) {

this.data = data;

}

public void run() {

data.increment();

}

}

class ShareData {

private int j = 10;

public synchronized void increment() {

j++;

System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);

}

public synchronized void decrement() {

j--;

System.out.println("线程:" + Thread.currentThread().getName() + "加操作之后,j = " + j);

}

}

关键还是思想:将共享数据和处理逻辑,封装在一个类中。业务逻辑(即加1的线程和减1的线程操作)在执行时,直接调用该类中的处理逻辑。这样做,更符合面向对象,更易于维护。

总结一下,对于多线程间对共享变量的操作,还是要实现互斥,使得对该共享变量的操作,实现原子性即可。

好了,简洁总结,深刻理解。有不对的地方,欢迎指出,在此谢过。

那时年少轻狂,把喜欢当做筹码,才敢肆无忌惮的任性。

----那时年少轻狂

java 线程间变量共享_多线程:(五)多个线程之间共享数据相关推荐

  1. java线程的创建线程_多线程(Thread、线程创建、线程池)

    第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序, ...

  2. Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制

    线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...

  3. java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用

    可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...

  4. java线程间通信管道_通过管道进行线程间通信

    管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读数据.通过管道,实现不同线程间的通信,而无须借助类似共享变量.临时文件之 ...

  5. java线程中的常用方法_[多线程] 线程中的常用方法-最详细

    线程中常用的方法 1.public void start() 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 2.public void run() 如果该线程是使用独立的 Runna ...

  6. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll

    文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...

  7. java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...

    多线程-Java中的对象监视器是什么意思? 为什么要使用这个词? 在阅读有关Java线程的文章时,我经常注意到这样的表达:"当前线程是该对象的监视器的所有者". 我的意思是:线程有 ...

  8. 线程中如何使用对象_多线程中如何使用gdb精确定位死锁问题

    在多线程开发过程中很多人应该都会遇到死锁问题,死锁问题也是面试过程中经常被问到的问题,这里介绍在c++中如何使用gdb+python脚本调试死锁问题,以及如何在程序运行过程中检测死锁. 首先介绍什么是 ...

  9. java map集合 事务控制_对象回收过程?线程池执行过程? map原理?集合类关系?synchronized 和 volatile ? 同一个类的方法事务传播控制还有作用吗?java 锁...

    1.  对象回收过程? 可达性分析算法: 如果一个对象从 GC Roots 不可达时,则证明此对象不可用. 通过一系列称为GC ROOTS的对象作为起点,从这些起点往下搜索,搜索走过的路径 称为引用链 ...

  10. java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java

    我注意到默认的tomcat 7线程池大小似乎是200. 但是普通的CPU似乎有16个内核. 因此只能并行执行16个线程 为什么tomcat使用那么多线程. 参考方案 多年以来,许多单核计算机问世,并且 ...

最新文章

  1. Django 1.11 bootstrap样式文件无法加载问题解决
  2. DB2的日志理解难点
  3. 版权监控中心怎么关闭_防火门监控系统让消防通道疏散更安全
  4. 生成一个文件 保存在指定的文件夹中 思路 python
  5. 服务器显示禁止设置多个ip地址,服务器禁止设置多个ip解决办法
  6. 【转载】Spring Cloud底层原理
  7. android gps转换度分秒,如何将GPS数据转换为度分秒
  8. 数据太大?你该了解Hadoop分布式文件系统
  9. android访问链接,尝试使用Android访问本地Web服务时连接被拒...
  10. JAVA实现简单计算器布局与功能(附完整源码)
  11. js判断数组是否为空
  12. ABAPDEMO批量更改BOM组件_SAP刘梦_新浪博客
  13. git commit 提交信息写错,怎么更改?
  14. 幕布图像大小与投影仪亮度关系对应表,--怎样选投影机和银幕不用愁了
  15. R语言使用dplyr包计算dataframe分组聚合四分位距IQR值(四分位距(interquartile range, IQR),又称四分差)
  16. python中 “按位与,或,异或”与C语言的不同
  17. 股票北向资金数据接口在哪里?
  18. FPGA校招笔试题分析
  19. 游戏技术汇:莉莉丝COO张昊解剖《刀塔传奇》开发经验心得
  20. elixir添加erlang模块

热门文章

  1. 计算机工程学院文艺例会,信息快讯 | 喜迎学代会-信息与计算机工程学院学生会组织召开第二次全体工作例会...
  2. 免费无账号直接使用openAI的chatGPT
  3. 求职信结尾经常用到的十句话
  4. win10卸载程序时提示找不到xxx.msi文件
  5. 聊一聊 C++ 中的 namespace
  6. 弱电机房可视化监控综合管理系统设计方案
  7. Python抓取淘女郎网页信息以及代码下载
  8. 增长奥秘:滴滴当年如何挖掘最有效的渠道和增长方法?
  9. 服务器里vm启动不了共享虚拟机,VMware Workstation Server共享服务不能启动
  10. CATT eCATT