欢迎来到51自学网!

51自学网

当前位置: 主页 > 网站建设 > 网页制作 >

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

时间:2018-04-05 22:21来源:网络整理 作者:51自学网
本文实例分析了java多线程中的volatile和synchronized用法。分享给大家供大家参考。具体实现方法如下: 复制代码 代码如下: package com.chzhao; public class Volatiletest extends Thread { private static in

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

复制代码 代码如下:

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才能保证线程安全?

说明:

(责任编辑:admin)

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容