美文网首页
java并发基础

java并发基础

作者: 陈桐Caliburn | 来源:发表于2020-07-04 09:04 被阅读0次
1、volatile和synchronized的区别

volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性

volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

2、通过静态内部类实现单例好处

1、不用synchronized,节省时间
2、懒加载,节省空间

3、synchronized三种用法

对于普通同步方法,锁是当前实例对象
对于静态同步方法,锁是当前类Class对象
对于同步方法块,锁是synchrionized括号里配置对象

//锁的三种用法
public class SyncDemo {

    private Object lock = new Object();
    private static Object sLock = new Object();

    public synchronized void methodInstance() {
        System.out.println( "锁是当前实例对象" );
    }

    public synchronized static void methodClass() {
        System.out.println( "锁是当前类Class对象" );
    }

    public static void methodConfig() {
        synchronized (SyncDemo.class) {
            System.out.println( "锁是synchronized配置对象 - 当前类Class对象" );
        }
    }

    public static void methodConfig3() {
        synchronized (sLock) {
            System.out.println( "锁是synchronized配置对象" );
        }
    }

    public void methodConfig1() {
        synchronized (lock) {
            System.out.println( "锁是synchronized配置对象" );
        }
    }

    public void methodConfig2() {
        synchronized (this) {
            System.out.println( "锁是synchronized配置对象 - 当前实例对象" );
        }
    }

    public static void main(String[] args) {
        SyncDemo demo = new SyncDemo();

        //当前实例对象
        demo.methodInstance();
        demo.methodConfig2();
        System.out.println();

        //当前类Class对象
        SyncDemo.methodClass();
        SyncDemo.methodConfig();
        System.out.println();

        //配置对象
        SyncDemo.methodConfig3();
        demo.methodConfig1();
    }

}

相关文章

网友评论

      本文标题:java并发基础

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