线程锁关键字@synchronized
2015-12-11 13:25
197 查看
static Config * instance =nil;
+(Config *) Instance {
@synchronized(self) {
if(nil ==
instance) {
[self new];
}
}
returninstance;
}
+(id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if(instance ==nil){
instance = [superallocWithZone:zone];
return instance;
}
}
return nil;
}
在上面两个例子中都用到 关键字@synchronized,这里大概说一下
@通过 synchronized关键字来声明synchronized 块。语法如下:
@synchronized(syncObject) { }
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
+(Config *) Instance {
@synchronized(self) {
if(nil ==
instance) {
[self new];
}
}
returninstance;
}
+(id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if(instance ==nil){
instance = [superallocWithZone:zone];
return instance;
}
}
return nil;
}
在上面两个例子中都用到 关键字@synchronized,这里大概说一下
@synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
@synchronized 方法控制对类(一般在IOS中用在单例中)的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法锁方能执行,否则所属就会发生线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类,至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突(只要所有可能访问类的方法均被声明为
synchronized)。
synchronized 块:
@通过 synchronized关键字来声明synchronized 块。语法如下:@synchronized(syncObject) { }
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
相关文章推荐
- nuget个人常用命令整理
- No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'
- 王海盯上京东,假货问题是本质
- QMutex 类学习笔记
- CTEX里的函数、符号及特殊字符
- JAVA性能调优之基本调优策略和手段
- show_ip.sh
- RecyclerView Item 的点击事件
- aerospike工具集——Command-Line Utility (cli)
- ubuntu安装openssh-server报依赖错误
- zhphp framework (五) 框架加载类
- CCF真题之最大矩形
- photoview源码解析
- ORA-24324 ORA-01041
- Didn't find class "android.support.v7.widget.RecyclerView"
- samba搭建
- zhphp framework (四)动态加载应用程序产量,方便任何程序代码重构
- Netstat端口占用情况
- get方式带参数请求方法
- CCF考前注意几点