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

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

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不禁可以解决一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前所有的修改结果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容