[self.condition wait];这行代码会堵住该线程,并进行解锁操作(也就是放开那把锁)
[self.condition signal ]唤醒等待条件的那条线程(signal一发出去,等待的线程就会被唤醒),
一唤醒就会做另外一件事情,对锁就行重新加锁
而想对同一把锁进行加锁,前提条件是这把锁目前是放开状态,没有被别的线程加锁
线程的任务一旦执行完毕,线程的生命周期就结束了,一旦生命周期结束了,该线程也就无法在使用
准确来讲,使用runloop是为了让线程保持激活状态

通过runloop来保住该线程不会销毁

performSelector的本质是添加了定时器,而定时器是需要runloop的支持的,而子线程默认是没有开启runloop的。所以test方法不会执行

这就可以达到__one先执行,__two后执行,可以用于一个线程依赖于另一个线程的结果时使用。也就是可以让子线程按顺序执行--- lock是直接加锁,不用管这把锁是什么条件值

锁创建的时候,不传条件,直接创建,那条件默认就是0

当不管条件是什么,都能加锁成功的话,就直接用lock加锁
线程同步,就是多个线程同时访问一块资源的时候,按顺序访问。也就是线程1访问完了,线程2在去访问...,
线程同步无非就是按顺序执行。线程同步的本质就是希望多线程按照一定的顺序执行,不要同时执行。

信号量

关于信号量的时间,要是传FOREVER就会一直在那等,直到信号量大于0,才会继续往下走。如果传NOW,就里面判断下信号量是否大于0,不大于0,就不等了,继续往下执行

synchronized底层是mutex.lock。是递归锁

更推荐第三种信号量和第四种mutex

这样也能保证每个方法里面的锁是不一样的

宏的一种写法
网友评论