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及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ... 
随机推荐
- 牛客-长沙理工校赛C-取手机
			传送门:https://www.nowcoder.com/acm/contest/96/C 参考:http://www.cnblogs.com/Dillonh/p/8835074.html 题意: d ... 
- codeforces #583 problem D(搜索好题)
			题目大意:在一个已经有障碍的地图上,设置尽可能少的障碍使得(1,1)无法到达(n,m),行进路线位向下或向右. 数据范围:n*m<=1e6 解题思路:答案一定是小于等于2的,因为可以直接阻碍(1 ... 
- python实现去掉空行
			# coding = utf-8def clearBlankLine(): file1 = open('text1.txt', 'r', encoding='utf-8') # 要去掉空行的文件 fi ... 
- github初学者搭建自己的网站
			如何利用github打造博客专属域名 感谢园友的无私共享-- http://www.cnblogs.com/xuehaoyue/p/6551217.html 选分支 建立好库,在设置 这里选择博客类型 ... 
- Maven依赖配置和依赖范围
			Maven依赖配置 一个dependency的声明可以包含以下元素: <dependencies> <dependency> <groupId>org.apache ... 
- Android程序员接下来的路该如何走?
			随着“5G”(第五代移动通信技术)商用进程越来越快,各个芯片和终端厂商们都已经开始布局准备,想必智能手机会是消费者最先能够接触到5G的重要终端,而和其相辅相生的移动互联网也势必会有新的发展. 但是和行 ... 
- Android 图片处理之 Fresco
			一.关于 Fresco github: https://github.com/facebook/fresco API: http://www.fresco-cn.org/javadoc/referen ... 
- JSP获取网络IP地址
			import javax.servlet.http.HttpServletRequest; public class RemoteAddress { public static String getR ... 
- 网关高可用之keepavlived全流程(安装/配置/验证/解析)
			1.场景描述 因为要做网关的高可用,用到了keepalived+nginx,来保证nginx的高可用.(微服务时代之网关及注册中心高可用架构设计),如下图: 安装了keepavlived,走了一些弯路 ... 
- [VB.NET Tips]ParamArray参数数组
			ParamArray参数数组,可以理解为传递给方法的多余的参数全都存放在这个数组中. ParamArray只能是ByVal按值传递,不能是可选参数,而且只能做为方法定义的最后一个参数. 非常类似于Py ... 
