线程之线程共享成员变量的几种情况
public class ThreadScopeMultiShareData { /** * 多线程之间的共享数据的方式*/ /* * 如果每个线程执行的代码一样,可以使用同一个runnable对象,这个共享数据就可以放在runnable中,例如卖票系统 * 如下例*/// public static void main(String[] args) {//// Ticket ticket = new Ticket();// new Thread(ticket).start();// new Thread(ticket).start();// // }// //}// class Ticket implements Runnable{//// private int ticketNum = 100;// public void run() {//// while(true){// ticketNum --;// System.out.println("the rest of ticket num is : " + ticketNum);// try {// Thread.sleep(100);// } catch (InterruptedException e) {//// TODO Auto-generated catch block// e.printStackTrace();// }// if(ticketNum<1){// break;// }// }// // // } /* * 如果每个线程执行的代码不一样,比如一个(run方法)要求加上1,一个(run方法)要求减去1 * 这就要有两个run方法,也就是有两个Runnable * 如下例*/// public static void main(String[] args){// final NumTest numTest = new NumTest();// new Thread(new Runnable() {// // @Override// public void run() {// numTest.increment();// // }// }).start();// new Thread(new Runnable() {// // @Override// public void run() {// numTest.decrement();// }// }).start();// }// }//// class NumTest{// private int num = 6;// public void increment(){// while(true){// num++;// System.out.println(num);// try {// Thread.sleep(100);// } catch (InterruptedException e) {//// TODO Auto-generated catch block// e.printStackTrace();// }// }// }// public void decrement(){// while(true){// num--;// System.out.println(num);// try {// Thread.sleep(100);// } catch (InterruptedException e) {//// TODO Auto-generated catch block// e.printStackTrace();// }// }// } /* * 上面的例子是把需求体现了,但是有些复杂,优化后的实例如下 * 这就是实现了把共享数据num及其方法封装在另外的一个对象NumTest中, * 然后把这个对象逐一传递给各个runnable对象, * 这样的好处是容易实现对该数据进行各个数据操作之间的互斥和通信*/ // public static void main(String[] args) {// final NumTest numTest = new NumTest();// new Thread(new IncrementRunnable(numTest)).start();// new Thread(new DecrementRunnable(numTest)).start();// }//}// class IncrementRunnable implements Runnable{// private NumTest numTest;// public IncrementRunnable(NumTest numTest) {// this.numTest = numTest;// }// public void run() {// numTest.increment();// }// }// class DecrementRunnable implements Runnable{// private NumTest numTest;// public DecrementRunnable(NumTest numTest){// this.numTest = numTest;// }// public void run() {// numTest.decrement();// }// }// class NumTest{// private int num = 6;// public void increment(){// num ++;// System.out.println(num);// }// public void decrement(){// num --;// System.out.println(num);// }// } }/* * 将runnable对象作为一个类的内部类,共享数据作为这个外部的类的成员变量, * 每个线程对共享数据的操作方法也分配给外部类, * 作为外部类的各个runnable对象调用调用外部类的这些方法 * 这也能很好的是想互斥和通信 * (这和上例的第一种情况几乎相似,就是成员变量和局部变量的区别)*/ //java提供Atomic类能帮助我们解决一些多线程共享数据的问题,详情查看文档
转载于:https://www.cnblogs.com/1350995917ding/archive/2011/09/23/2185999.html
线程之线程共享成员变量的几种情况相关推荐
- java 线程 静态变量_线程之间是否共享静态变量?
问题 我的老师在一个关于线程的上层java课上说了一些我不确定的东西. 他表示以下代码不一定会更新2910104598变量.根据他的说法,两个线程不一定共享静态变量,特别是在每个线程(主线程与Read ...
- 【单片机学习笔记】(6):字符串处理函数、变量的三种情况、用函数实现模块化程序设计、晶振与延时、指针
/ 字符串处理函数 / stract函数 字符串连接函数 例:printf("%s", stract(str1, str2)): strcpy(字符串或字符数组名)和strnc ...
- Java 成员变量中有数组的情况处理
public class BookDateSet {private Book[] books;public BookDateSet() {Book books = new Book[4];Catego ...
- [JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇)
引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接 ...
- Java 变量存储的位置(局部变量、成员变量)
Java把内存划分为以下bai4个部分: 1.栈区(stacksegment)-由编译器自动du分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源. 2.堆区 ...
- 别翻了,成员变量和局部变量在多线程中的使用,看这篇就够了
一. 成员变量和局部变量的区别 在类中的位置不同 成员变量:在类中方法外面 局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中) 在内存中的位置不同 成员变量:在堆中(方法区中静态区),成 ...
- Android 线程与线程安全
1.线程 线程是进程中可独立执行的最小单位,也是CPU资源分配的基本单位. 进程是程序向操作系统申请资源的基本条件,一个进程可以包含多个线程,同一个进程中的线程可以共享进程中的资源,如内存空间和文件句 ...
- java 销毁线程_线程 学习教程(一): Java中终止(销毁)线程的方法
结束线程有以下三种方法: (1)设置退出标志,使线程正常退出,也就是当run()方法完成后线程终止 (2)使用interrupt()方法中断线程 (3)使用stop方法强行终止线程(不推荐使用,Thr ...
- python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?
1.进程.线程.线程池的概念 进程是一个动态的过程,是一个活动的实体.简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者.可以说,进程中包含了多个可以同时运行的线程 ...
最新文章
- Windows/Linux下引用jar包,并用javac/java编译运行
- java methodtype_java基于MethodHandle调用方法
- 跨平台与云端创新,为企业和开发者开辟更广阔的未来
- Linux USB札记
- Beauty Of Unimodal Sequence(HDU-6592)
- 滴滴派发15亿出行消费券 覆盖快车、优享等多产品
- 深入理解C++11pdf
- 难怪各家抢滩物联网!真实原因竟是……
- 使用STL中的list容器实现单链表的操作
- fpga驱动步进电机转动指定角度_通过PLC实现步进电机定位控制的方法
- Linux centos安装chromium
- IDEA导入Eclipse项目--ecli
- Transformer模型详解(图解最完整版)
- 微信公众号文章中的图片处理有哪些技巧?看这篇就够了。
- 千山独行-一个人的创业路(连载一)
- 社保卡医保卡居民健康卡电动读卡器|读写器M100-C2W如何规避标的入围行业技术壁垒的问题
- Docker 搭建 LNMP + Wordpress
- python办公自动化(9)利用pandas的行列转换处理排班表
- 大学计算机应用教程马秀麟,马秀麟
- 统计各数据集上的坏占比