欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

java多线程中的volatile和synchronized用法分析

时间:2021-02-04 11:35:17|栏目:JAVA代码|点击:

本文实例分析了java多线程中的volatile和synchronized用法。分享给大家供大家参考。具体实现方法如下:

复制代码 代码如下:
package com.chzhao;

public class Volatiletest extends Thread {

    private static int count = 0;

    public void run() {
        count++;
    }

    public static void main(String[] args) {
        Thread threads[] = new Thread[10000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Volatiletest();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(count);
    }
}

代码如上,期待输出的是10000,然后,由于count++不是线程安全的,所以输出经常会小于10000.

为了解决这个问题,增加了volatile关键字。

复制代码 代码如下:
package com.chzhao;

public class Volatiletest extends Thread {

    private volatile static int count = 0;

    public void run() {
        count++;
    }

    public static void main(String[] args) {
        Thread threads[] = new Thread[10000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Volatiletest();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(count);
    }
}

修改之后,还经常输出不是10000的值。

修改为synchronized形式,代码如下:

复制代码 代码如下:
package com.chzhao;

public class SynchronizedTest extends Thread {
    private static int count = 0;

    public void run() {
        synchronized (LockClass.lock) {
            count++;
        }
    }

    public static void main(String[] args) {
        Thread threads[] = new Thread[10000];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new SynchronizedTest();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(count);
    }
}


复制代码 代码如下:
package com.chzhao;

public class LockClass {
    public static byte[] lock = new byte[0];

}

这样修改之后,输出是10000.

这样是否说明volatile这个关键字完全没用呢?只有synchronized才能保证线程安全?

说明:

Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。

也就是说,在某些情况下,volitile比synchronized用起来更方便,当然,同步性更差一点。

希望本文所述对大家的Java程序设计有所帮助。

上一篇:Java int与integer的对比区别

栏    目:JAVA代码

下一篇:Java如何使用interrupt()终止线程

本文标题:java多线程中的volatile和synchronized用法分析

本文地址:http://www.codeinn.net/misctech/56823.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有