美文网首页
synchronized代码块具有volatile的同步功能

synchronized代码块具有volatile的同步功能

作者: 迷糊小生 | 来源:发表于2019-03-30 09:41 被阅读0次

不多说,直接看例子,例子是最好的学习方法。

package other.thread8;

public class SyncDemo {

    private Boolean flag = true;

    public void run() {
        while (flag) {
        }
        System.out.println("已经停止了!");
    }
    
    public void stop() {
        flag = false;
    }

}
package other.thread8;

public class ThreadA extends Thread {
    private SyncDemo demo;
    public ThreadA(SyncDemo demo) {
        this.demo = demo;
    }
    @Override
    public void run() {
        demo.run();
    }
}
package other.thread8;

public class ThreadB extends Thread {
    private SyncDemo demo;
    public ThreadB(SyncDemo demo) {
        this.demo = demo;
    }
    @Override
    public void run() {
        demo.stop();
    }
}
public class Test {

    public static void main(String[] args) {
        try {
            SyncDemo demo = new SyncDemo();
            ThreadA threadA = new ThreadA(demo);
            threadA.start();
            Thread.sleep(500);
            ThreadB threadB = new ThreadB(demo);
            threadB.start();
            System.out.println("已经发起了停止命令!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
image.png

由此可见A线程和B线程flag值没有可视性造成的,而关键字synchronized剧透可视性。

下面将SyncDemo改为:

public class SyncDemo {

    private Boolean flag = true;

    public void run() {
        String str = new String();
        while (flag) {
            synchronized (str) {
                
            }
        }
        System.out.println("已经停止了!");
    }
    
    public void stop() {
        flag = false;
    }

}

打印结果:


image.png

关键字synchronized可以使多个线程访问同一个资源具有同步性,而且它还具有将线程工作内存中的私有变量与公共内存中的变量同步的功能。

关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法或某一个代码块。它包含两个特性:互斥性和可见性。同步synchronized不禁可以解决一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前所有的修改结果。

相关文章

网友评论

      本文标题:synchronized代码块具有volatile的同步功能

      本文链接:https://www.haomeiwen.com/subject/oixjbqtx.html