做ios也有1年了,C#的东西有些都忘记了,最近几天也打算重温一下,不能学了ios把C#给抛弃了,两者都要抓,一精多专。目前C#只是重温,重点是web这块。今天主要是想起了之前做过的面试题,虽然题比较变态,但也有它的意义。

public void test(int i)
 {
    lock(this)
   {
      )
     {
          i--;
          test(i);
      }
    }
 }

根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。

想必做过C#面试过的都会遇到过这题,我记得我第一次面试做的时候也是做错了,想着递归中包含锁,肯定会死锁。

当时回去自己动手敲了一下,然并卵,没有死锁。后来又看了大学时的C#教材,又百度了下,发现自己把锁理解错了。我记得当时教材上举的例子是一个银行取款的例子。而在这道题中,一直都在主线程中,并没有开启第二个线程,怎么会发生锁呢。 我记得数据库中也有锁机制,锁主要是解决并发的问题,锁生成的原因主要有两个:同时争夺同一资源A、B同时要C,争夺资源时形成一个环状,A要B,B要C,C要A。

在百度搜了下,百度也有这个,解释如下:在《CLR via C#》第二版(中文版,清华大学出版社出版)的第530页中第7行找到了这样的描述:“同样需要引起注意的是线程可以递归拥有同步块”。即同一线程可以递归调用lock语句。

---------------华丽分割线-----------------------

刚才试了下oc中的NSLock,可是同样用上面的就会发生死锁的情况.

//
//  Lock.h
//  LockTest
//
//  Created by City--Online on 16/2/3.
//  Copyright © 2016年 City--Online. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Lock : NSObject
@property (nonatomic,strong) NSLock *lock;
-(void) test:(int )i;
@end
#import "Lock.h"

@implementation Lock
-(void) test:(int )i
{
    [self.lock lock];
    )
    {
            i--;
            NSLog(@"%d",i);
            [self test:i];
    }
    [self.lock unlock];
}
-(NSLock *)lock
{
    if (!_lock) {
        _lock=[[NSLock alloc]init];
    }
    return _lock;
}
@end
-- :::]
-- :::] *** -[NSLock lock]: deadlock (<NSLock: 0x100106bf0> '(null)')
-- :::] *** Break on _NSLockError() to debug.

百度了下原来还有一个锁来解决这个的NSRecursiveLock

将上面的NSLock改为NSRecursiveLock,就解决了。具体参考http://www.cocoachina.com/ios/20150513/11808.html

-- :::]
Program ended with exit code: 

NSRecursiveLock可以允许同一线程多次加锁,而不会造成死锁。递归锁会跟踪它被lock的次数。每次成功的lock都必须平衡调用unlock操作。只有所有达到这种平衡,锁最后才能被释放,以供其它线程使用。

NSLock每次进入都会去加一次锁,而从第二次开始,由于锁已经被使用了且没有解锁,所以它需要等待锁被解除,这样就导致了死锁,线程被阻塞住了。两者实现的机制可能不一样,这个还要请哪个大神指点。

C#、OC递归锁的更多相关文章

  1. ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁

    本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景.然后再聊一下Atomic的代码实现.Atomic主要负责多线程下的 ...

  2. python--同步锁/递归锁/协程

    同步锁/递归锁/协程 1 同步锁 锁通常被用来实现对共享资源的同步访问,为每一个共享资源创建一个Lock对象,当你需需要访问该资源时,调用acquire()方法来获取锁对象(如果其他线程已经获得了该锁 ...

  3. 26 python 初学(线程、同步锁、死锁和递归锁)

    参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 并发:一段时间内做一些事情 并行:同时做多件事情 线程是操作系统能够进行运算调度的基本单位 ...

  4. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

  5. Python 递归锁

    import time from threading import Thread, Lock, RLock def f1(locA, locB): # print('xxxx') # time.sle ...

  6. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  7. 线程锁(互斥锁Mutex)及递归锁

    一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...

  8. day 7-6 GIL,死锁,递归锁与信号量,Event,queue,

    摘要: 1.死锁与递归锁 2.信号量 3.Event 4.Timer 5.GIL 6.Queue 7.什么时候该用多线程和多进程 一. 死锁与递归锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过 ...

  9. python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)

    ###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位    线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个 ...

随机推荐

  1. C#实现像微信PC版一样的扫码登录功能

    现在好些网站都支持扫码登录,感觉上安全了很多,但是本地程序扫码登录的不多,就用C#实现了一下,需要作如下准备 在官网上申请一个企业微信,有条件的话做个企业认证吧,我们的是认证过的,所以账号和本地其他系 ...

  2. Winform嵌入其它应用程序

    Options: using CommandLine; using System; using System.Collections.Generic; using System.Linq; using ...

  3. Kylin性能调优记——业务技术两手抓

    本文由  网易云发布. 作者:冯宇 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 背景 最近开始使用了新版本的Kylin,在此之前对于新版本的了解只是代码实现和一些简单的新功能测试,但是并没有 ...

  4. C博客第01次作业---顺序,分支结构

    1.本章学习总结 1.1 思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 经过了这一周的学习,从一开始对C语言一无所知,到现在能够写出基本的代码,感到非常开心. 学习C语言也并非想象 ...

  5. HTTP请求报文支持的各种方法

    常见的HTTP方法如下: 1.GET GET是最常用的方法.通常用于请求服务器发送某个资源. 2.HEAD HEAD与GET的行为类似,但服务器在响应中只返回首部,不会返回实体的部分.这就允许客户端在 ...

  6. 玩PHP必了解的PHP常用符号和函数

    原文:http://y312ff.blog.163.com/blog/static/12701109420119119575812/ 近在写PHP程序的时候发现了一些特殊的PHP符号,例如连续小于符号 ...

  7. [java实现]常见算法之字符串操作

    一.字符串反转 把一个句子中的打次进行反转,比如“how are you” ,变为 “you are how” // 字符串反转 public class StringTest { // 字符反转的方 ...

  8. python学习,day4:生成器,通过yield实现单线程情况下的并发运算

    首先了解一个斐波那契函数的实现,了解下生成器的工作流程 # coding=utf-8 # Author: RyAn Bi def fib(max): n,a,b=0,0,1 while n < ...

  9. UVA_11020 Efficient Solutions 【平衡二叉搜索树set用法】

    一.题面 UVA11020 二.分析 最近脑子有点不好使吧,这题还想了很久. 对于给定的两个值要满足题面中的条件,那么我们可以把这两个值转化到平面中的坐标去理解. 首先,需要考虑的是维护的所有点其实是 ...

  10. maven工程下testng简单使用

    创建maven工程后,将Repository仓库中maven代码粘贴复制到pom.xml文件中,仓库地址:<!-- https://mvnrepository.com/artifact/org. ...