• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

java 搞代码 4年前 (2022-01-09) 24次浏览 已收录 0个评论

本文实例分析了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<strong>本文来源gaodai#ma#com搞@@代~&码网</strong> (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多线程中的volatile和synchronized用法分析相关文章请关注搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java多线程中的volatile和synchronized用法分析

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址