Java/Swift 单例模式的多种写法
来源:互联网 发布:手机怎么添加mac地址 编辑:程序博客网 时间:2024/06/05 20:55
设计模式的书本上一般是这样写:
public final class SingleTon {
private static SingleTon sInstance;
public static SingleTon getInstance() {
if (sInstance == null) {
sInstance = new SingleTon();
}
return sInstance;
}
}
仔细看这几行代码, 能发现什么问题吗? 脑洞大开一下。
1. 在外部类中可以new出SingleTon对象。
2. 多线程时怎么办? 可能生成多个SingleTon实例, 我们想到了锁。
public final class SingleTon {
private static SingleTon sInstance;
private SingleTon() {
//将构造函数声明成私有函数, 从而在类外部无法实例化该类
}
public synchronized static SingleTon getInstance() {
if (sInstance == null) {
sInstance = new SingleTon();
}
return sInstance;
}
}
添加synchronized关键字后实际上是SingleTon.class上锁, 但对函数上锁的颗粒度较大, 影响多线程并发的性能, 实际上我们只需要对new对象上锁, 读对象时不上锁。 更好的写法是
public final class SingleTon {
private static SingleTon sInstance;
public synchronized static SingleTon getInstance() {
if (sInstance != null) {
return sInstance;
}
synchronized(SingleTon.class) {
if (sInstance == null) {
sInstance = new SingleTon();
}
}
return sInstance;
}
}
如果不使用锁, 能不能实现单例呢? 答案是可以的, 肯定要借助静态内部类了。
public final class SingleTon {
private SingleTon() {
}
private static class Inner {
static SingleTon sInstance = new SingleTon (); //私有静态类, 只会执行一次new
}
public static SingleTon getInstance() {
return Inner.sInstance;
}
}
这种写法看起来很高大上, 没用到synchroized关键字实现了锁, 保证一个进程只有一个实例。
Swift3.0单例模式的2个写法如下, 虽然没有同步关键字, 但苹果已经说了加上static关键字后多线程时也能保证是一个实例。
注意要声明init函数, 而且是private访问类型, 从而只能通过类的静态参数得到实例。
苹果的说明:In Swift, you can simply use a static type property, which is guaranteed to be lazily initialized only once, even when accessed across multiple threads simultaneously
final class SingleTon { //单例类的属性 var name: String var age: Int private init() { name = "" age = 0 print("SingleTon init is called") } static let sInstance = SingleTon()}final class SingleTon2 { //单例类的属性 var name: String var age: Int private init() { name = "" age = 0 print("SingleTon init is called") } //使用闭包的GET语法, 类似于lazy参数, 在运行时赋初值 static var sInstance: SingleTon2 { let instance = SingleTon2() instance.name = "zhangsan" instance.age = 20 return instance }}
- Java/Swift 单例模式的多种写法
- 单例模式的多种写法
- 关于单例模式的多种写法
- 3.单例模式的多种写法
- Swift多种实现单例写法
- Swift的单例模式写法
- [Swift]swift单例模式的三种写法
- 黑马程序员--关于单例模式的多种写法
- Swift单例的写法
- swift 单例的写法
- Swift单例的写法
- swift 单例模式正确写法
- java 多种单例模式
- java 单例模式的写法
- Java单例模式的写法
- Java单例模式的写法
- Java 的单例模式写法
- Java 单例模式的写法
- easyui 选中指定行
- orbslam2(2)-追踪
- 使用 JS 复制文本内容
- 简单明了的cocoapods的使用
- Oracle--多用户控制
- Java/Swift 单例模式的多种写法
- mysql索引总结
- SSH配置远程主机信任
- Android录屏功能的实现
- 流媒体传输协议介绍
- Context#getResources().getDrawable()方法过时后的替代方法
- 高德地图---显示/定位/POI搜索/大头针/气泡
- 自定义Git
- Redis 配置文件详解