美文网首页
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