关于实现Runnable接口的类中有公共属性问题
背景:多线程开发的时候,一般都是继承Runnable接口,但是有可能类中有一个公共变量,那么这个变量是不是线程安全的呢?
代码如下:
public class TestThread implements Runnable{private int number = 0;public TestThread(int num) {number = num;}@Overridepublic void run() {for(int i = 0;i<10;i++) {System.out.println("当前线程为:"+Thread.currentThread().getName()+",num="+(number++));}}}
当使用线程池进行操作时,可以分为2种情况。
1,共享某一种元素
2,不想共享某一个元素
代码如下:
1,
public class Test {public static void main(String[] args) {TestThread t = new TestThread(0);for(int i = 0;i<10;i++) {CommonThreadPool.getInstance().getFixedThreadPool().execute(t);}} }
此种写法会有多线程问题,因为共享了一个元素
2,
public class Test {public static void main(String[] args) { // TestThread t = new TestThread(0);for(int i = 0;i<10;i++) {CommonThreadPool.getInstance().getFixedThreadPool().execute(new TestThread(0));}} }
此种写法某种程度来说不会有多线程问题,因为new对象之后并没有共享同一个元素
如果想避免某一些问题,那么可以加锁看来控制,如:
public class TestThread implements Runnable{private int number = 0;public TestThread(int num) {number = num;}@Overridepublic synchronized void run() {for(int i = 0;i<10;i++) {System.out.println("当前线程为:"+Thread.currentThread().getName()+",num="+(number++));}}}
以上只是示例一下,因为加锁的地方是要看具体的情况的。
所以,最初的这段代码:
public class TestThread implements Runnable{private int number = 0;public TestThread(int num) {number = num;}@Overridepublic void run() {for(int i = 0;i<10;i++) {System.out.println("当前线程为:"+Thread.currentThread().getName()+",num="+(number++));}}}
其实某种程度上来说并不安全,因为依赖于外部的调用方式。
转载于:https://www.cnblogs.com/huangtao1927/p/9732985.html
关于实现Runnable接口的类中有公共属性问题相关推荐
- Thread源码-----传实现了Runnable接口的类的实例给Thread的作用
传送门:https://wangchangchung.github.io/2016/12/05/Java常用类源码--Thread源码解析/ 1. thread的构造函数有: public Threa ...
- Java多线程的实现方式-Thread 类,Runnable 接口
在 Java 的 JDK 开发包中,已经自带了对多线程技术的支持,可以方便地进行多线程编程.实现多线程编程的方式主要有两种:一种是继承 Thread 类,另一种是实现 Runnable 接口.下面详细 ...
- Java多线程(2)--Thread类继承和Runnable接口创建线程
Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现. Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run() ...
- 微博类php,新浪微博开放平台WeiboClient类的公共方法(PHP)
相关文章: 在初步掌握微博应用开发的流程后,建议通读一遍weibooauth.php中的代码,优先读class WeiboClient中公共方法的定义.这些方法都是直接操作微博和用户的,清楚有哪些方法 ...
- 实现java.lang.Runnable接口
package com.multithread.learning;public class Thread2 implements Runnable {private String name;priva ...
- 多线程之实现Runnable接口及其优点
多线程之实现Runnable接口: 1.创建一个Runnable接口的实现类 2.在实现类中重写Runnable接口的run方法 3.创建一个Runnable接口实现类的对象 4.创建Thread类对 ...
- 实现Runnable接口
Thread类是java.lang提供的一个实现了Runnable接口并定义了一些操作线程的方法的类.不过基于Java编程语言规范,若子类已继承了一个类,就无法再直接继承Thread类.这时可通过直接 ...
- java runnable接口 sleep_java Runnable接口如何创建线程
java Runnable接口如何创建线程 导语:编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.下面是java Runnable接口创建线程的相关资料,欢迎阅读: java Ru ...
- 如何创建线程?如何实现Runnable接口?
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: · 实现Runnable 接口. · 可以继承Thread类. 下面的先介绍了第一种方式: 实现Runnable接口 ...
最新文章
- 零基础ui设计培训一定要知道字体设计规则
- struts2 action重定向
- vue中 .sync 修饰符 个人理解
- ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车黑线循迹红外避障综合实验
- php爱奇艺筛选标签,三种排序 快速筛选好视频_软件资讯技巧应用-中关村在线
- sql server 按照日期自动生成单据编号的函数
- matlab安装详解
- android camera实例
- Spark-SQL常用内置日期时间函数
- 计算机网络工程概论论文,网络工程专业导论论文提纲格式模板 网络工程专业导论论文框架怎么写...
- ch341a烧录器zip_CH341A编程器
- Error 1606 Could Not Access Network Location %SystemDrive%/inetpub/wwwroot/
- error:crosses initialization of ...的解决办法
- (六)我的JavaScript系列:更好的JavaScript之CoffeeScript
- 普适计算Topic推荐-AMiner
- 内核驱动 (二)Linux按键驱动分析
- mac 安装selenium 教程
- 28 个提升开发幸福度的 VsCode 插件
- sql server 排序按笔画
- STM32电子钟万年历Proteus仿真_LCD1602显示