Java的volatile和synchronized学习


=Start=

缘由:

学习整理。方便以后参考。

正文:

参考解答:
volatile的作用:

volatile关键字的作用是:使变量在多个线程间可见;但仅靠volatile不能保证线程的安全性。

volatile主要用在多个线程实例感知变量被更改了的场合,从而使得各个线程获得最新的值。它强制线程每次从主内存中读取变量,而不是从线程的私有内存中读取变量,从而保证了数据的可见性。


volatile和synchronized的区别:
  • volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
  • volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
  • volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
  • volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
  • volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

package com.ixyzero.learn.multithread;

public class Run {
    public static void main(String[] args) {
        // try {
        //     RunThread thread = new RunThread();
        //     thread.start();
        //     Thread.sleep(1000);
        //     thread.setRunning(false);
        // } catch (InterruptedException e) {
        //     e.printStackTrace();
        // }

        MyThread[] mythreadArray = new MyThread[100];
        for (int i = 0; i < 100; i++) {
            mythreadArray[i] = new MyThread();
        }
        for (int i = 0; i < 100; i++) {
            mythreadArray[i].start();
        }

    }
}


public class RunThread extends Thread {

    volatile private boolean isRunning = true;

    public boolean isRunning() {
        return isRunning;
    }

    public void setRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }

    @Override
    public void run() {
        System.out.println("进入到run方法中了");
        while (isRunning == true) {
        }
        System.out.println("线程执行完成了");
    }
}


public class MyThread extends Thread {
    public volatile static int count;

    private static void addCount() {
        for (int i = 0; i < 100; i++) {
            count++;
        }
        System.out.println("count=" + count);
    }

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

 

参考链接:

=END=


《“Java的volatile和synchronized学习”》 有 1 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注