博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发线程学习001(volatile 使用)
阅读量:6898 次
发布时间:2019-06-27

本文共 1847 字,大约阅读时间需要 6 分钟。

hot3.png

1. volatile 可以使得多个线程之间可见

  代码示列如下:

 

public class RunThread extends Thread{

    private volatile boolean isRunning = true;

    public void setRunning(boolean isRunning){
        this.isRunning = isRunning;
    }
    
    public void run(){
        System.out.println("进入run 方法.....");
        while(isRunning){
            // 如果为....
        }
        System.out.println("线程结束");
    }
    
    public static void main(String[] args) throws Exception{
        RunThread th = new RunThread();
        th.start();
        Thread.sleep(3000);
        th.setRunning(false);
        System.out.println("isRunning 线程已经被设置成false");
        Thread.sleep(1000);
        System.out.println(th.isRunning);
    }

说明没有有在字段isRunning 前面加volatile  字段时候,执行完主函数,运行程序并没有关闭

 如果加了volatile 的时候运行的程序在执行完相关操作的时候会关闭。

2.volatile 只是具有可见性,没有原子性,要实现原子性建议使用atomic 类的系列对象

 列子代码如下:

  普通int 类型执行

import java.util.concurrent.atomic.AtomicInteger;

 

/**

 * volatile 不支持原子型

 * 

 * ASUS

 *

 */

public class VolatileNoAtomic extends Thread {

private static volatile int count;

private static void addCount(){

for(int i=0;i<1000;i++){

count++;

}

System.out.println(count);

}

public void run(){

addCount();

}

public static void main(String[] args){

VolatileNoAtomic[] arr = new VolatileNoAtomic[10];

for(int i=0;i<10;i++){

arr[i] = new VolatileNoAtomic();

}

for(int i=0;i<10;i++){

arr[i].start();

}

}

}

  运行结果如下图所示:

1273

1615
2615
3615
4615
5615
6615
7615
8620
9347

2.有原子性

import java.util.concurrent.atomic.AtomicInteger;

 

/**

 * volatile 不支持原子型

 * 

 * ASUS

 *

 */

public class VolatileNoAtomic extends Thread {

private static AtomicInteger count = new AtomicInteger();

private static void addCount(){

for(int i=0;i<1000;i++){

count.incrementAndGet();

}

System.out.println(count);

}

public void run(){

addCount();

}

public static void main(String[] args){

VolatileNoAtomic[] arr = new VolatileNoAtomic[10];

for(int i=0;i<10;i++){

arr[i] = new VolatileNoAtomic();

}

for(int i=0;i<10;i++){

arr[i].start();

}

}

}

转载于:https://my.oschina.net/kuchawyz/blog/1798134

你可能感兴趣的文章
我的友情链接
查看>>
Apache与Svn安装配置
查看>>
ubuntu12.04 locale字符编码设置
查看>>
数据持久化,序列化,反序列化,文件读写
查看>>
高级复制配置步骤
查看>>
Qt 踩坑记录:LINK : fatal error LNK1104: 无法打开文件“qtmaind.lib”
查看>>
java poi 导出excel
查看>>
比较早采用信息化进行管理的企业
查看>>
Solr配置文件分析与验证
查看>>
[Twitter] Fibonacci Sequence
查看>>
我的友情链接
查看>>
那些不加班的开发团队,都看透了持续集成的四大好处
查看>>
iOS开发之CALayer
查看>>
无人值守安装Linux系统
查看>>
启动VMware虚拟机 内部错误
查看>>
解决CentOS7控制台中文显示乱码
查看>>
我的友情链接
查看>>
关于应用交付设备的使用及云计算结构之我见
查看>>
nodejs实现cas客户端
查看>>
简略CPU发展史
查看>>