文档章节

线程(二)

 幸福快乐的小码农
发布于 2016/10/12 16:23
字数 379
阅读 11
收藏 0

1、volatile关键字主要使变量在多线程中可见

什么叫可见,就是在我在主线程中有个volatile变量,多线程中其中一个线程改了这个值,那么我希望其他线程读取到最新的值,就是可见。就是这个变量的改变我其他线程都能读到最新的

public class VolatileTest {

    public boolean isRunning = true;

    public void setRunning(boolean flag) {
        this.isRunning = flag;
    }

    public void print() {
        System.out.println("进入print方法");
        while (isRunning) {
//            System.out.println("开始执行");
        }
        System.out.println("线程停止");
    }

    public static void main(String[] args) {
        final VolatileTest volatileTest = new VolatileTest();
        Thread thread = new Thread(new Runnable() {
            public void run() {
                volatileTest.print();
            }
        });

        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        volatileTest.setRunning(false);
        System.out.println("已修改");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(volatileTest.isRunning);
    }
}

开启个线程,执行print()方法,希望我设置isRunning=false后,不在执行,但是结果是

已经修改为false了,但程序还没停止,为什么呢?

这个可以理解为JVM的缘故,在jdk1.5之后,对线程做了个优化,每个线程有个独立的运行空间,存放主线程中的内容拷贝到自己副本中,是线程执行效率更高些,上面代码中,我们更高变量值,只是在主线程中更新,但是新建线程中变量并没有改变,所以并不影响线程执行中的值。 加了volatile后,保证新建线程每次读取最新变量值。

加了volatile后,只能保证变量可见性,但并不能变量的原子性,保证原子性用AoticInteger

 

 

© 著作权归作者所有

上一篇: 线程(三)
下一篇: 线程(一)
粉丝 0
博文 12
码字总数 5501
作品 0
闸北
私信 提问
使用信号量控制线程互斥和同步。

首先要知道PV原语的概念。以下是百度百科对PV原语的介绍: PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量的概念1965年由著名的荷兰计...

Leafage_M
2017/10/18
0
0
【原创】分布式之数据库和缓存双写一致性方案解析(三)

正文 博主本来觉得,《分布式之数据库和缓存双写一致性方案解析》,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用 这一方案作为缓存更新策略,而不是先更新数据库,再...

孤独烟
2018/07/12
0
0
分布式之数据库和缓存双写一致性方案解析(三)

正文 博主本来觉得,《分布式之数据库和缓存双写一致性方案解析》,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用 先删缓存,再更新数据库,再删缓存 这一方案作为缓...

hensemlee
01/25
0
0
(转)并发场景下HashMap死循环导致CPU100%的问题

问题的核心点在于多线程进行扩容的时候每个线程会生成一个新的hashtab对象,线程A生成新的hashtab以后,线程B在线程A新生成的hastab上进行操作会造成死循环。 可以参考jdk1.7的hashmap扩容问...

晴天哥
2018/04/17
0
0
java中多个线程调用同一个socket发送消息

一个客户端,线程 Thread1,Thread2 ,Thread3 。。。。使用同一个socket发送消息(消息头+消息体)在每个线程调用这个socket发送消息要不要对其进行枷锁,如果不加锁服务器端收到的消息包会...

lonuery
2013/01/20
5.6K
8

没有更多内容

加载失败,请刷新页面

加载更多

微信小程序

张小龙的定义 1、不需要下载安装即可使用 实际上也有下载和安装的流程,只不过安装包很小<2M,使得这两个过程很短,不易感知到 2、用户"用完即走"不用关心是否安装太多应用 适用于偶尔使用一...

星闪海洋
14分钟前
0
0
怎么修改truffle中的solidity版本?

当使用truffle开发以太坊solidity合约时,经常碰到的一个问题,就是你的solidity合约代码所要求的编译器版本,与truffle预装的solitiy编译器版本不匹配。本文将介绍如何更改truffle中的solid...

汇智网教程
15分钟前
0
0
JsonUtil工具类

使用的是fastJson package util; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.f......

嘿嘿嘿IT
15分钟前
0
0
Mementor模式

//个人感觉就想当于把某个类的某部分或全部复制一份保存在另一个类中,然后在有必要的时候用保存的复制的那部分来恢复之前的某种状态 https://blog.csdn.net/syc434432458/article/details/5...

南桥北木
20分钟前
0
0
Redis几个常见面试题目

1 什么是redis? Redis 是一个基于内存的高性能key-value数据库。 2. Memcache与Redis的区别都有哪些? 1)存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 ...

jason_kiss
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部