Java 学习笔记之 实例变量与线程安全
实例变量与线程安全:
不共享数据:
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 学习笔记之 实例变量与线程安全的更多相关文章
- Java 学习笔记之 实例变量非线程安全
实例变量非线程安全: 如果多个线程共同访问1个对象中的实例变量,则可能出现“非线程安全”问题. public class UnSafeHasSelfPrivateNum { private int n ...
- 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中可以防止字 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
随机推荐
- P1073 最优贸易 建立分层图 + spfa
P1073 最优贸易:https://www.luogu.org/problemnew/show/P1073 题意: 有n个城市,每个城市对A商品有不同的定价,问从1号城市走到n号城市可以最多赚多少差 ...
- poj 2240 Arbitrage(Bellman_ford变形)
题目链接:http://poj.org/problem?id=2240 题目就是要通过还钱涨自己的本钱最后还能换回到自己原来的钱种. 就是判一下有没有负环那么就直接用bellman_ford来判断有没 ...
- codeforces 486 E. LIS of Sequence(dp)
题目链接:http://codeforces.com/contest/486/problem/E 题意:给出n个数,如果一个数满足不属于最长递增序列,那么输出1,如果属于最长递增序列但是不属于所有最长 ...
- C# 活体检测
活体检测有多种情形,本文所指:从摄像头获取的影像中判断是活体,还是使用了相片等静态图片. 场景描述 用户个人信息中上传了近照,当用户经过摄像头时进行身份识别. 此时,如果单纯的使用摄像头获取的影像进行 ...
- Java 编程语言中很少被人了解的特性-statement label
下面的语句会编译报错或者打印什么? System.out.print("baidu site :"); https://www.baidu.com; System.out.prin ...
- C语言实现二级指针表示字符串数组
头文件: #include<stdlib.h> #include<stdio.h> #include<string.h> 函数原型: char ** createB ...
- 简单说一下你对http和https的理解
http是一种超文本传输协议,传输的数据都是未加密的,也就是显示在明面上的,是现在互联网上应用最为广泛的一种网络协议,相对来说不太安全,但是所需成本很小.http一般的端口号为80. https则是具 ...
- 【第十二篇】微信支付(APP)集成时碰到的问题(.net提示“无权限”、iOS跳转到微信支付页面中间只有一个“确定”按钮)(转)
直入主题之前,请容我吐槽一下微*的官方东西:ASDFQ%#$%$#$%^FG@#$%DSFQ#$%.......:吐槽玩了!大家心照就好. 要完成手机APP跳转到微信的APP进行微信支付,需要进行如下 ...
- apache ignite系列(二):配置
ignite有两种配置方式,一种是基于XML文件的配置,一种是基于JAVA代码的配置: 这里将ignite常用的配置集中罗列出来了,一般建议使用xml配置. 1,基于XML的配置 <beans ...
- Python 开发植物大战僵尸游戏
作者:楷楷 链接:https://segmentfault.com/a/1190000019418065 开发思路 完整项目地址: https://github.com/371854496/pygam ...