Java 学习笔记之 实例变量非线程安全
实例变量非线程安全:
如果多个线程共同访问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 学习笔记之 实例变量非线程安全的更多相关文章
- Java 学习笔记之 实例变量与线程安全
实例变量与线程安全: 不共享数据: public class NoSharedThread extends Thread { private int count = 5; public NoShare ...
- java学习笔记(基础篇)—变量与表达式
一:局部变量和实例变量 定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则. 作用域:指它的存在范围,只有在这个范围内,程序代码才能访问它. 变量的生 ...
- Java学习笔记9---类静态成员变量的存储位置及JVM的内存划分
笔记8提到了类静态成员变量的访问方式,但静态成员变量存储在哪里呢?在网上查阅不少资料,发现好多内容都是过时的了,其中主流观点是静态成员变量存放在方法区.JDK8之前,静态成员变量确实存放在方法区:但J ...
- java学习笔记----数据类型,变量,常量
一.数据类型 1.基本类型(8种,又称内置数据类型).6种数字类型(byte,short,int,long,float,double),一种字符型(char),一种布尔类型(boolean). byt ...
- Java学习笔记3、变量、数据类型
标识符 常见的命名规则(见名知意) 包名全部小写 类或者接口,一个单词:首字母大写,多个单词:每个单词首字母大写. 方法或者变量:一个单词:首字母小写,多个单词:从第二个单词开始,每个单词首字母大写. ...
- Java 学习笔记之 异常法停止线程
异常法停止线程: public class RealInterruptThread extends Thread { @Override public void run() { try { for ( ...
- java学习笔记之基础篇
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
随机推荐
- ZOJ4027 Sequence Swapping DP
link:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4027 题意: 有一个括号序列,每个括号对应一个值,现在可以使得相 ...
- POJ-3261-Milk Patterns-二分+哈希
Milk Patterns 题意: 在一串数字中,求至少连续k次的最大子序列长度: 思路: 二分加哈希: #include <cstdio> #include <iostream&g ...
- 天梯杯 L2-010. 排座位
L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...
- 基于WFST的语音识别解码器
学习语音识别有些时间了.老板要求我们基于Kaldi搭一个语音识别系统,在设备上通过MIC讲话,连着设备的PC的console上就能基本实时显示出讲话的内容.由于我们都是小白,刚开始可以要求低些,就用传 ...
- 蚂蚁SOFA系列(2) - SOFABoot的Readiness健康检查机制
作者:404,公众号404P,转载请注明出处. 前言 SOFABoot是蚂蚁金服的开源框架,在原有Spring Boot的基础上增强了不少能力,例如Readiness Check,类隔离,日志空间隔离 ...
- Linux基础_网站权限规划
Linux系统默认的权限: 对于文件来说, 默认的权限: rw-r--r-- 644 对于目录来说:rwxr-xr-x 755 网站比较安全的权限: 网址程序存放在/app/blog 目录下面. 1 ...
- 锁和synchronized
锁的常见概念 互斥: 同一时刻只有一个线程执行 临界区:一段需要互斥执行的代码 细粒度锁: 用不同的锁对受保护资源进行精细化管理. 细粒度锁可以提高并行度,是性能优化的一个重要手段 死锁 :一组互相竞 ...
- Java 中创建对象的 5 种方式!
Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Employee类: class Employee implements Cloneable, Serializable { pri ...
- @Qualifier高级应用---按类别批量依赖注入【享学Spring】
每篇一句 罗斯:选秀状元可能有水货,但MVP绝对没有 前言 在上篇文章(讲解@LoadBalanced负载均衡)的末尾,我抛出了一个很重要的问题,建议小伙伴自己深入思考一番:本文主要针对此问题,作出一 ...
- SpringSecurity自定义UsernamePasswordAuthenticationFilter
UsernamePasswordAuthenticationFilter介绍 UsernamePasswordAuthenticationFilter是AbstractAuthenticationPr ...