java多线程之多线程的三大特性
来源:互联网 发布:python可以开发游戏吗 编辑:程序博客网 时间:2024/06/07 18:43
多线程的三大特性:原子性、可见性、有序性
1.什么是原子性
即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
一个很经典的例子就是银行账户转账问题:
比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。
我们操作数据也是如此,比如i = i+1;其中就包括,读取i的值,计算i,写入i。这行代码在Java中是不具备原子性的,则多线程运行肯定会出问题,所以也需要我们使用同步和lock这些东西来确保这个特性了。
原子性其实就是保证数据一致、线程安全一部分,
2.什么是可见性
当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
若两个线程在不同的cpu,那么线程1改变了i的值还没刷新到主存,线程2又使用了i,那么这个i值肯定还是之前的,线程1对变量的修改线程没看到这就是可见性问题。 使用volatile修饰全局变量达到可见性。
用法如下,我们先看一下下面这段代码:
package com.java.thread;/** * @Author:Mr.Liu * @Description: * @Date:Created in 10:06 2017/12/6 * @Modified By: */public class ThreadVolatile { public static void main(String[] args) { Res res = new Res(); new Thread(res,"No.1").start(); try { Thread.sleep(2000);//做一些其他事情 } catch (InterruptedException e) { e.printStackTrace(); } res.setFlag(true); System.out.println(Thread.currentThread().getName()+"已经停止运行"); }}class Res implements Runnable{ public boolean flag = false; public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; System.out.println(Thread.currentThread().getName()+"的flag已经设置为:"+this.isFlag()); } @Override public void run() { System.out.println(Thread.currentThread().getName()+"开始运行"); while (true){ if(flag){ System.out.println(Thread.currentThread().getName()+"停止运行"); Thread.currentThread().stop(); } } }}
为什么主线程已经修改了共享的Res对象中的flag值但是No.1线程没有结束呢?
因为这里存在两个线程一个是No.1线程,还有一个是main主线程,这两个线程运行的时候都会在自己的本地内存中操作flag副本的值,但是两个线程之间是不可见的,当其中一个线程修改了本地内存中的flag的时候,并没有将这个falg的最新值更新到主内存的flag上,也就是主线程修改了flag对No.1线程是不可见的,因此,No.1线程不会结束。下面我们对代码做一个小小的修改:
再次运行更改后的代码,结果如下:
可以看到程序已经全部结束运行了。使用Volatile关键字将解决线程之间可见性, 强制线程每次读取该值的时候都去“主内存”中取值
3.什么是有序性
程序执行的顺序按照代码的先后顺序执行。
一般来说处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。如下:
int a = 10; //语句1
int r = 2; //语句2
a = a + 3; //语句3
r = a*a; //语句4
则因为重排序,他还可能执行顺序为 2-1-3-4,1-3-2-4
但绝不可能 2-1-4-3,因为这打破了依赖关系。
显然重排序对单线程运行是不会有任何问题,而多线程就不一定了,所以我们在多线程编程时就得考虑这个问题了。
- java多线程之多线程的三大特性
- java的三大特性之多态
- java的三大特性之多态
- java的三大特性之多态
- java面向对象的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解 Java 的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 面向对象的三大特性之多态-java版
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- 理解java的三大特性之多态
- java三大特性之多态
- Java三大特性之多态
- jquery报错
- Google 开发者大会报名结果出炉
- 区块链中GAS介绍
- CentOS 7 Linux 安装Tomcat 8(咋个办呢 zgbn)
- 利用pytorch实现神经网络风格迁移Neural Transfer
- java多线程之多线程的三大特性
- 这两天工作中遇到的问题,先记下,回头整理
- SVN主干合并到分支
- 【codevs】1204 寻找子串位置
- LD_LIBRARY_PATH shouldn't contain the current directory
- webstorm中使用git管理服务器上的代码——入门级
- 正则效验
- 【SVN】Error running context: 由于目标计算机积极拒绝,无法连接
- Android面试题整理(2)