同步:并发

2019-07-07 23:44 更新
同步:并发。多个线程同时访问同一份资源,确保资源安全,即线程安全。


锁:每个对象都有且只有一把锁。

一、同步块:

synchronized (对象) {


}
注:
括号内放的是对象,类.class也是对象。

二、同步方法

public synchronized void function1() {
    //普通成员方法默认获得的是当前对象的锁。
}


public static synchronized void function1() {
    //静态方法默认获得的是当前类的锁,即类.class的锁。
}

单例模式的应用: 1.懒汉式

/**
 * 懒汉式
 * 1.构造器私有化。
 * 2.声明私有的静态属性。
 * 3.对外提供访问属性的静态方法,确保对象存在。
 * */
class MyJvm{
    private static MyJvm instance;
    private MyJvm() {}
    public static MyJvm getInstance() {
        if(instance == null) {//提供效率
            synchronized (MyJvm.class) {
                if(instance == null) {//安全
                    instance = new MyJvm();
                }
            }
        }
        return instance;
    }
}

2.饿汉式

/**
 * 饿汉式
 * 1.构造器私有化。
 * 2.声明私有的静态属性,同时创建该对象。
 * 3.对外提供访问属性的静态方法。
 * 静态成员会在加载类的时候就被初始化,因此可以直接获取。但有时使用MyJvm的其他方法时但不想实例化是做不到的,可以使用第三种方法。
 * 可参考static关键字知识点。
 * */
class MyJvm{
    private static MyJvm instance = new MyJvm();
    private MyJvm() {}
    public static MyJvm getInstance() {
        return instance;
    }
}

3.延迟加载

/**
 * 延迟加载
 * 当使用JvmHolder类时才会初始化instance,延缓加载时间。
 * 这样在使用MyJvm的其他方法时就不会实例化instance。
 * */
class MyJvm{
    private static class JvmHolder{
        private static MyJvm instance = new MyJvm();
    }
    private MyJvm() {}
    public static MyJvm getInstance() {
        return JvmHolder.instance;
    }
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号