实例变量与线程安全:

不共享数据:

public class NoSharedThread extends Thread {
private int count = 5; public NoSharedThread(String name){
super();
this.setName(name);
} @Override
public void run() {
super.run();
while (count > 0){
count--;
System.out.println("Thread name: " + Thread.currentThread().getName() + ", count: " + count);
}
}
} public class ThreadRunMain {
public static void main(String[] args) {
testSharedSafeThead();
} public static void testNoSharedThread() {
NoSharedThread a = new NoSharedThread("a");
NoSharedThread b = new NoSharedThread("b");
NoSharedThread c = new NoSharedThread("c");
a.start();
b.start();
c.start();
} }

运行结果:

可见线程之间没有互相干扰,都在操作自己的count变量。

共享数据:

public class SharedThread extends Thread{
private int count = 5;
public SharedThread(String name) {
super();
this.setName(name);
} @Override
public void run() {
super.run();
count--;
System.out.println("Thread name: " + Thread.currentThread().getName() + ", count: " + count);
}
} public class ThreadRunMain {
public static void main(String[] args) {
testSharedThead(); } public static void testSharedThead(){
SharedThread st = new SharedThread("SharedThread");
Thread a = new Thread(st,"a");
Thread b = new Thread(st,"b");
Thread c = new Thread(st,"c");
Thread d = new Thread(st,"d");
Thread e = new Thread(st,"e");
a.start();
b.start();
c.start();
d.start();
e.start(); } }

运行结果:

可见线程之间互相干扰,产生count值一样的情况,非线程安全的问题出现。

共享数据线程安全:

public class SharedSafeThread extends Thread{
private int count = 5;
public SharedSafeThread(String name) {
super();
this.setName(name);
} @Override
public synchronized void run() {
super.run();
count--;
System.out.println("Thread name: " + Thread.currentThread().getName() + ", count: " + count);
} } public class ThreadRunMain {
public static void main(String[] args) {
testSharedSafeThead();
} public static void testSharedSafeThead(){
SharedSafeThread sst = new SharedSafeThread("SharedSafeThread");
Thread a = new Thread(sst,"a");
Thread b = new Thread(sst,"b");
Thread c = new Thread(sst,"c");
Thread d = new Thread(sst,"d");
Thread e = new Thread(sst,"e");
a.start();
b.start();
c.start();
d.start();
e.start(); } }

运行结果:

可见线程之间没有互相干扰,count值没有重复,线程安全。

Java 学习笔记之 实例变量与线程安全的更多相关文章

  1. Java 学习笔记之 实例变量非线程安全

    实例变量非线程安全: 如果多个线程共同访问1个对象中的实例变量,则可能出现“非线程安全”问题. public class UnSafeHasSelfPrivateNum { private int n ...

  2. java学习笔记(基础篇)—变量与表达式

    一:局部变量和实例变量 定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则. 作用域:指它的存在范围,只有在这个范围内,程序代码才能访问它. 变量的生 ...

  3. Java学习笔记9---类静态成员变量的存储位置及JVM的内存划分

    笔记8提到了类静态成员变量的访问方式,但静态成员变量存储在哪里呢?在网上查阅不少资料,发现好多内容都是过时的了,其中主流观点是静态成员变量存放在方法区.JDK8之前,静态成员变量确实存放在方法区:但J ...

  4. java学习笔记----数据类型,变量,常量

    一.数据类型 1.基本类型(8种,又称内置数据类型).6种数字类型(byte,short,int,long,float,double),一种字符型(char),一种布尔类型(boolean). byt ...

  5. Java学习笔记3、变量、数据类型

    标识符 常见的命名规则(见名知意) 包名全部小写 类或者接口,一个单词:首字母大写,多个单词:每个单词首字母大写. 方法或者变量:一个单词:首字母小写,多个单词:从第二个单词开始,每个单词首字母大写. ...

  6. Java 学习笔记之 异常法停止线程

    异常法停止线程: public class RealInterruptThread extends Thread { @Override public void run() { try { for ( ...

  7. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

  8. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

  9. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

随机推荐

  1. CodeForces - 534B-Covered Path+思路

    CodeForces - 534B 题意:给定初始和末尾的速度,和最大加速度和总时间,求出走的最长路程: 我一开始以为代码写起来会很繁琐... #include <iostream> #i ...

  2. POJ 3694 Network 无向图双联通+LCA

    一开始题目没看清楚,以为是增加那条边后还有多少桥,所以就当做是无向图tarjan缩点后建树,然后求u,v的最近公共祖先,一直wa. 后来再看题目后才发现边放上去后不会拿下来了,即增加i条边后桥的数量. ...

  3. 2018CCPC 吉林现场赛 赛后总结

    一直以来都没有比赛完写总结的习惯,导致前面几次比赛都没有写过总结. 这是我写的第一场总结把,有时间有想法还记得细节的话再把前面几次比赛的总结给补上把. 热身赛: 热身赛的时候,写的比较急想着快点做出题 ...

  4. 如何在GitHub上上传自己的项目

    此文为转载,地址:https://blog.csdn.net/m0_37725003/article/details/80904824 本文链接:https://blog.csdn.net/m0_37 ...

  5. Python作业本——第3章 函数

    今天看完了第三章,习题都是一些概念性的问题,就不一一解答了. 实践项目是创建一个Collatz序列,并且加上验证输入是不是一个整数. def collatz(number): if number % ...

  6. 做一个完整的Hadoop项目

     1. 完整的数据流图 由同ip访问的次数: SQL查询 select ip,count(ip) from tablename Group by ip; 基于Hadoop分析 使用Hadoop分析,需 ...

  7. Nuget打包类库及引用

    什么是nuget 适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以创建.共享和使用有用的代码. 通常,此类代码捆绑到"包"中,其中包含编译的代码(如 DL ...

  8. struts2表单提单细节处理

    1. 上传文件 大部分项目避免不了要上传文件. struts2提供了封闭的上传文件的入口, 网络上也存在大量的插件用于网页表单中上传文件. 由于自己习惯用SSH框架, 所以介绍一下struts2中文件 ...

  9. (七十二)c#Winform自定义控件-雷达图

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  10. Java中的方法和方法重载

    上次我们讲了Java中的一些基本的语法;今天我们就讲一点内容,来说说Java中的方法和方法重载以及需要注意的一些地方; 方法: Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段, ...