Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

说一下你了解的iOS开发中的各种锁 #86

Open
tbfungeek opened this issue Feb 13, 2020 · 0 comments
Open

说一下你了解的iOS开发中的各种锁 #86

tbfungeek opened this issue Feb 13, 2020 · 0 comments

Comments

@tbfungeek
Copy link
Owner

iOS中有如下几种锁:

  • 互斥锁:NSLock,互斥锁在出现锁的争夺时,未获得锁的线程会主动让出时间片,阻塞线程并睡眠,在使用的时候需要注意在同一个线程上加锁解锁,并且加锁和解锁需要成对出现,在解锁之前不允许重复加锁。
  • 递归锁: NSRecursiveLock/synchronized 递归锁的存在是为了避免互斥锁在重复加锁的时候会导致死锁的问题,它会对加锁次数进行计数,只有在解锁次数等于加锁次数的时候才会释放锁。
  • 自旋锁: OSSpinLock/os_unfair_lock和互斥锁不同的是自旋锁在没获得锁的时候,不是让出时间片,睡眠等待,而是一直尝试获取锁,打个比方,互斥锁在没获得锁进不去的时候,会在门口睡着等待,而自旋锁会一直尝试一直敲门,自旋锁的好处是它不涉及到用户态和内核态的切换,所以效率较高,但是它有个问题就是会发生优先级反转问题,并且在短时间内无法获得锁的情况下,会降低CPU效率。所以它只有在内核可抢占式比较适用对于单CPU非抢占式的情况下只适用于保持锁时间比较短的情况。
  • 信号量: dispatch_semaphore,加锁时会把信号量的值减一,并判断是否大于零。如果大于零,立刻执行。如果等于零的时候将会等待,在资源使用结束的时候释放信号量让信号量增加1。并唤醒等待的线程。信号量可以有更多的取值空间,用来实现更加复杂的同步,而不单单是线程间互斥。
  • 条件锁: NSCondition/NSConditionLock一般用于生产者消费者,或者满足某些条件的时候进行解锁的场景。
  • 读写锁: dispatch_barrier_async/pthread_rwlock。读写锁把对共享资源的访问者划分成读和写,在多处理器系统中,它允许同时有多个读来访问共享资源,最大可能的读者数为实际的逻辑CPU数。但是写操作是排他性的。所以将读和写操作分开有利于最大程度实现并发。
  • atomic:atomic用于保证属性setter、getter的原子性操作,在getter和setter内部加了线程同步的锁,但是它并不能保证使用属性的过程是线程安全的
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant