相关疑难解决方法(0)

Java中volatile和synchronized之间的区别

我想知道在声明变量as volatile和始终访问synchronized(this)Java 中的块中的变量之间的区别?

根据这篇文章,http://www.javamex.com/tutorials/synchronization_volatile.shtml有很多要说的,但也有很多不同之处,但也有一些相似之处.

我对这条信息特别感兴趣:

...

  • 对volatile变量的访问永远不会阻塞:我们只进行简单的读或写操作,因此与synchronized块不同,我们永远不会持有任何锁;
  • 因为访问volatile变量永远不会持有锁,所以它不适合我们想要读取update-write作为原子操作的情况(除非我们准备"错过更新");

read-update-write是什么意思?写入也不是更新,还是仅仅意味着更新是依赖于读取的写入?

最重要的是,何时更适合声明变量volatile而不是通过synchronized块访问变量?使用volatile依赖于输入的变量是一个好主意吗?例如,有一个变量被称为render通过渲染循环读取并由按键事件设置?

java multithreading volatile synchronized java-me

222
推荐指数
4
解决办法
9万
查看次数

Java volatile修饰符和synchronized块

多个线程访问但仅在同步块内访问的变量是否需要volatile修饰符?如果没有,为什么?

java multithreading volatile synchronized

15
推荐指数
2
解决办法
5461
查看次数

为什么Volatile表现得很奇怪

我最近经历过volatile关键字这种奇怪的行为.我所知道的,

  1. volatile关键字应用于变量,以将一个线程对变量数据所做的更改反映到另一个线程上.

  2. volatile关键字阻止在线程上缓存数据.

我做了一个小测试........

  1. 我使用了一个名为count的整数变量,并在其上使用了volatile关键字.

  2. 然后制作2个不同的线程将变量值增加到10000,因此最终结果应为20000.

  3. 但事实并非如此,使用volatile关键字我一直没有得到20000,而是18534,15000等......有时候是20000.

  4. 但是虽然我使用了synchronized关键字,但它工作得很好,为什么......?

任何人都可以解释我挥发性关键字的这种行为.

我发布带有volatile关键字的代码,以及带有synchronzied关键字的代码.

以下代码与变量计数上的volatile关键字行为不一致

public class SynVsVol implements Runnable{

    volatile int  count = 0;

    public void go(){

        for (int i=0 ; i<10000 ; i++){
             count = count + 1;
         }
    }

    @Override
    public void run() {
        go();
    }

    public static void main(String[] args){

        SynVsVol s = new SynVsVol();
        Thread t1 = new Thread(s);
        Thread t2 = new Thread(s);
        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch …
Run Code Online (Sandbox Code Playgroud)

java multithreading volatile synchronized

8
推荐指数
2
解决办法
492
查看次数

标签 统计

java ×3

multithreading ×3

synchronized ×3

volatile ×3

java-me ×1