自定义线程中的实例变量对其他的线程有共享和不共享之分,对于不共享数据:每个线程都有各自的变量,他们对变量进行各自的管理,不存在多个线程访问同一个变量的情况。

看一个例子:

public class mythread1 extends Thread{public static void main(String[] args) {mythread1 aa =new mythread1("A");mythread1 bb =new mythread1("B");mythread1 cc =new mythread1("C");aa.start();bb.start();cc.start();}private int count =3;public mythread1(String name) {super();this.setName(name);}@Overridepublic void run() {super.run();while(count>0) {count--;System.out.println("线程"+this.currentThread().getName()+" count="+count);}}
}

输出:

线程A count=2
线程C count=2
线程B count=2
线程C count=1
线程A count=1
线程C count=0
线程B count=1
线程B count=0
线程A count=0

线程共享:多个线程可以访问同一个变量,会出现线程不安全的情况。

看一个例子:

public class mythread1 extends Thread{public static void main(String[] args) {mythread1 tt =new mythread1();Thread aa =new Thread(tt,"A");Thread bb =new Thread(tt,"B");Thread cc =new Thread(tt,"C");Thread dd =new Thread(tt,"D");aa.start();bb.start();cc.start();dd.start();}private int count =5;
//  public mythread1(String name) {
//      super();
//      this.setName(name);
//  }@Overridepublic void run() {super.run();count--;System.out.println("线程"+this.currentThread().getName()+" count="+count);}
}

输出:

线程A count=2
线程B count=2
线程D count=1
线程C count=2

有三个线程都打印出count=2,说明同时存在多个线程调用了count,产生了线程安全问题。我们希望看到的结果是各个线程打印出来的count值是依次递减的。

解决方案:

1 使用synchrnized关键字,给run()方法上锁,当其他线程调用时,必须要等到当前线程执行完,把锁释放,在等待的线程在此期间不断尝试获得锁,知道拿到为止。

看一个小例子:

public class mythread1 extends Thread{public static void main(String[] args) {mythread1 tt =new mythread1();Thread aa =new Thread(tt,"A");Thread bb =new Thread(tt,"B");Thread cc =new Thread(tt,"C");Thread dd =new Thread(tt,"D");aa.start();bb.start();cc.start();dd.start();}private int count =5;
//  public mythread1(String name) {
//      super();
//      this.setName(name);
//  }@Overridesynchronized public void run() {super.run();count--;System.out.println("线程"+this.currentThread().getName()+" count="+count);}
}

输出:

线程A count=4
线程D count=3
线程B count=2
线程C count=1

java多线程学习-实例变量和线程安全相关推荐

  1. Java多线程学习(八)线程池与Executor 框架

    历史优质文章推荐: Java并发编程指南专栏 分布式系统的经典基础理论 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问题看这篇就够了 目录: [TOC] 本节思维导图: ...

  2. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  3. Java多线程编程系列-实例变量和线程安全

    导语   上面说到了多线程的简单实现,编写了几个入门的小例子,这里我们来研究一下关于实例变量和线程安全的问题.在自定义的线程类中的实例变量针对其他线程可以有共享和不共享之分,下多个线程之间进行交互的时 ...

  4. java线程学习,GitHub - zksir/thread: Java多线程学习

    Java多线程学习 threadcoreknowledge包----线程核心知识基础 createthreads包 创建线程 1.实现多线程的方法是1种还是2种还是4种? Oracle官方:2种,一种 ...

  5. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  6. Java多线程编程-(4)-线程间通信机制的介绍与使用

    上一篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  7. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  8. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  9. 【转】Java 多线程学习

    原网址:https://www.cnblogs.com/yjd_hycf_space/p/7526608.html Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实J ...

  10. 转:Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

最新文章

  1. mfc程序转化为qt_以“企鹅电竞小程序”改版为例,讲解如何将用户核心路径转化为设计语言...
  2. antd 嵌套子表格_大型前端项目架构优化探索之路腾讯文档表格
  3. 知名论坛猴岛游戏论坛宣布永久关闭!
  4. java宠物店多态源代码
  5. js整体缩小网页_SEO网页优化的原则是什么?
  6. linux下下安装jdk-6u45-linux-x64.bin
  7. 016、JVM实战总结:大厂面试题:JVM中有哪些垃圾回收算法,每个算法各自的优劣?
  8. 带拼音计算机语言翻译软件,拼音转换汉字翻译器
  9. 【历史上的今天】7 月 1 日:分时系统之父诞生;支付宝推出条码支付;世界上第一支电视广告
  10. 凉宫春日的忧郁第五章
  11. 《徐志摩传》记得也好,最好你忘掉
  12. cocos2d-x的初步学习二十八之爱消除一
  13. 2020 中国移动的流量套餐
  14. 协同办公风口来袭,在线文档顺势崛起!
  15. 史上最全网络安全面试题总结
  16. SoapUI的一些基本设置
  17. HDU 6082 度度熊与邪恶大魔王 (完全背包)
  18. 亚马逊云科技风力发电厂在福勒岭启动了!
  19. 丢弃 HttpClient 了,这款轻量级框架更强!
  20. 电脑版无需PS一键抠图工具

热门文章

  1. eclipse报错 : One or more constraints have not been satisfied.
  2. S实现控制图片显示大小的方法【图片等比例缩放功能】
  3. ELK之ES-Logstash-Kibana互联
  4. Windows 10的成功能让苹果学到点什么?
  5. 【函数】fill和fill_n填充之区别
  6. a small test by windows live writer 2011
  7. linux定时备份Mysql
  8. content='width=device-width, initial-scale=1.0'的解释
  9. 11.看板方法---建立服务水平协议
  10. 42.验证和授权(2)