背景:多线程开发的时候,一般都是继承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接口的类中有公共属性问题相关推荐

  1. Thread源码-----传实现了Runnable接口的类的实例给Thread的作用

    传送门:https://wangchangchung.github.io/2016/12/05/Java常用类源码--Thread源码解析/ 1. thread的构造函数有: public Threa ...

  2. Java多线程的实现方式-Thread 类,Runnable 接口

    在 Java 的 JDK 开发包中,已经自带了对多线程技术的支持,可以方便地进行多线程编程.实现多线程编程的方式主要有两种:一种是继承 Thread 类,另一种是实现 Runnable 接口.下面详细 ...

  3. Java多线程(2)--Thread类继承和Runnable接口创建线程

    Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现. Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run() ...

  4. 微博类php,新浪微博开放平台WeiboClient类的公共方法(PHP)

    相关文章: 在初步掌握微博应用开发的流程后,建议通读一遍weibooauth.php中的代码,优先读class WeiboClient中公共方法的定义.这些方法都是直接操作微博和用户的,清楚有哪些方法 ...

  5. 实现java.lang.Runnable接口

    package com.multithread.learning;public class Thread2 implements Runnable {private String name;priva ...

  6. 多线程之实现Runnable接口及其优点

    多线程之实现Runnable接口: 1.创建一个Runnable接口的实现类 2.在实现类中重写Runnable接口的run方法 3.创建一个Runnable接口实现类的对象 4.创建Thread类对 ...

  7. 实现Runnable接口

    Thread类是java.lang提供的一个实现了Runnable接口并定义了一些操作线程的方法的类.不过基于Java编程语言规范,若子类已继承了一个类,就无法再直接继承Thread类.这时可通过直接 ...

  8. java runnable接口 sleep_java Runnable接口如何创建线程

    java Runnable接口如何创建线程 导语:编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.下面是java Runnable接口创建线程的相关资料,欢迎阅读: java Ru ...

  9. 如何创建线程?如何实现Runnable接口?

    大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: · 实现Runnable 接口. · 可以继承Thread类. 下面的先介绍了第一种方式: 实现Runnable接口 ...

最新文章

  1. 零基础ui设计培训一定要知道字体设计规则
  2. struts2 action重定向
  3. vue中 .sync 修饰符 个人理解
  4. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车黑线循迹红外避障综合实验
  5. php爱奇艺筛选标签,三种排序 快速筛选好视频_软件资讯技巧应用-中关村在线
  6. sql server 按照日期自动生成单据编号的函数
  7. matlab安装详解
  8. android camera实例
  9. Spark-SQL常用内置日期时间函数
  10. 计算机网络工程概论论文,网络工程专业导论论文提纲格式模板 网络工程专业导论论文框架怎么写...
  11. ch341a烧录器zip_CH341A编程器
  12. Error 1606 Could Not Access Network Location %SystemDrive%/inetpub/wwwroot/
  13. error:crosses initialization of ...的解决办法
  14. (六)我的JavaScript系列:更好的JavaScript之CoffeeScript
  15. 普适计算Topic推荐-AMiner
  16. 内核驱动 (二)Linux按键驱动分析
  17. mac 安装selenium 教程
  18. 28 个提升开发幸福度的 VsCode 插件
  19. sql server 排序按笔画
  20. STM32电子钟万年历Proteus仿真_LCD1602显示

热门文章

  1. 2021亚太内容分发大会 阿里云荣获三项大奖
  2. 开课啦! dubbo-go 微服务升级实战
  3. 连续三年蝉联第一,Flink 荣膺全球最活跃的 Apache 开源项目
  4. 如何将实时计算 Flink 与自身环境打通?
  5. Java 开发者必备手册开放下载!
  6. 如何解决游戏延迟,增强用户体验? 几种可行方案分享
  7. 如何用行为树开发游戏AI以及任务系统?
  8. 实时光线追踪技术:业界发展近况与未来挑战
  9. 分分合合分分,谷歌医疗走向大败退
  10. Eclipse Neon安装指导