实例变量非线程安全:

如果多个线程共同访问1个对象中的实例变量,则可能出现“非线程安全”问题。

public class UnSafeHasSelfPrivateNum {
private int num = 0;
public void addI(String username) {
try {
if (username.equals("a")){
num = 100;
System.out.println("a set over!");
Thread.sleep(2000);
} else {
num = 200;
System.out.println("b set over!");
}
System.out.println(username + " num = " + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public class UnSafeHasSelfPrivateNumThreadA extends Thread{
private UnSafeHasSelfPrivateNum numRef; public UnSafeHasSelfPrivateNumThreadA(UnSafeHasSelfPrivateNum numRef) {
this.numRef = numRef;
} @Override
public void run() {
super.run();
numRef.addI("a");
}
} public class UnSafeHasSelfPrivateNumThreadB extends Thread {
private UnSafeHasSelfPrivateNum numRef; public UnSafeHasSelfPrivateNumThreadB(UnSafeHasSelfPrivateNum numRef) {
this.numRef = numRef;
} @Override
public void run() {
super.run();
numRef.addI("b");
}
} public class ThreadRunMain {
public static void main(String[] args) {
testUnSafeHasSelfPrivateNumThread();
} public static void testUnSafeHasSelfPrivateNumThread(){
UnSafeHasSelfPrivateNum numRef = new UnSafeHasSelfPrivateNum();
UnSafeHasSelfPrivateNumThreadA athread = new UnSafeHasSelfPrivateNumThreadA(numRef);
athread.start();
UnSafeHasSelfPrivateNumThreadB bthread = new UnSafeHasSelfPrivateNumThreadB(numRef);
bthread.start();
}
}

运行结果:

a的值本应该是100,却变成了200. 用synchronized关键字解决问题:

public class UnSafeHasSelfPrivateNum {
private int num = 0;
synchronized public void addI(String username) {
try {
if (username.equals("a")){
num = 100;
System.out.println("a set over!");
Thread.sleep(2000);
} else {
num = 200;
System.out.println("b set over!");
}
System.out.println(username + " num = " + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

运行结果:

在两个线程访问同一个对象中的同步方法时是线程安全的,先执行a,在执行b。

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

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

    实例变量与线程安全: 不共享数据: public class NoSharedThread extends Thread { private int count = 5; public NoShare ...

  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. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

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

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

随机推荐

  1. ios APP上的自动化测试

    1. 下载 http://blog.manbolo.com/2012/04/08/TestAutomation.zip%20 2. 开发工具安装:http://jingyan.baidu.com/ar ...

  2. CSU 1803 2016 湖南省2016省赛

    1803: 2016 Submit Page   Summary   Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 1416    ...

  3. 调用arcpy包批量进行矢量掩膜提取

    使用一个polygon矢量提取某个文件夹中所有的tif格式栅格数据 (要确保先安装好arcpy包) import arcpy arcpy.CheckOutExtension("spatial ...

  4. netcore mvc 的简单实现

    实现的功能 简单的路由系统 支持中间件 简单Filter支持 只支持HttpPost.HttpGet 使用Dotliquid做为视图渲染引擎 核心实现 HttpChannel 复制监听Tcp请求,并按 ...

  5. kafka对消费者分配分区规则(Java源码)

    在上一篇 kafka topic消息分配partition规则(Java源码) 我们对生产者产生的消息分配partition规则进行了分析,那么本章我们来看看消费者是怎么样分配partition的. ...

  6. change,Ringo题目

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. bluetooth(蓝牙) AVRCP协议概念及代码流程解析

    一 概念 AVRCP全称:The Audio/Video Remote Control Profile (AVRCP) 翻译成中文就是:音视频远程控制协议.概念:AVRCP定义了蓝牙设备之间的音视频传 ...

  8. Winform中使用ZedGraph实现曲线图中字体去掉边框

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  9. Python Api接口自动化测试框架 excel篇

    工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库req ...

  10. 自动更新Aria2中的bt-trackers选项

    #!/bin/bash /usr/sbin/service aria2 stop list=`wget -qO- https://raw.githubusercontent.com/ngosang/t ...