皮皮网

【斗罗大陆源码分享】【ios 扫雷 源码】【公式源码 v】object wait源码

时间:2024-11-29 23:34:25 分类:时尚 来源:新版小程序源码

1.Lock的await/singal 和 Object的wait/notify 的区别
2.你应该知道的源码wait/notify那点事儿
3.Java 中LockSupport类在C#中的实现

object wait源码

Lock的await/singal 和 Object的wait/notify 的区别

       Lock的await/singal 和 Object的wait/notify 的区别

       åœ¨ä½¿ç”¨Lock之前,我们都使用Object 的wait和notify实现同步的。举例来说,一个producer和consumer,consumer发现没有东西了,等待,produer生成东西了,唤醒。

       çº¿ç¨‹consumer 线程producer

        synchronize(obj){

        obj.wait();//没东西了,等待

       } synchronize(obj){

        obj.notify();//有东西了,唤醒

       }

       æœ‰äº†lock后,世道变了,现在是:

       lock.lock();

       condition.await();

       lock.unlock(); lock.lock();

       condition.signal();

       lock.unlock();

       ä¸ºäº†çªå‡ºåŒºåˆ«ï¼Œçœç•¥äº†è‹¥å¹²ç»†èŠ‚。区别有三点:

       1. lock不再用synchronize把同步代码包装起来;

       2. 阻塞需要另外一个对象condition;

       3. 同步和唤醒的对象是condition而不是lock,对应的方法是await和signal,而不是wait和notify。

       ä¸º

       ä»€ä¹ˆéœ€è¦ä½¿ç”¨condition呢?简单一句话,lock更灵活。以前的方式只能有一个等待队列,在实际应用时可能需要多个,比如读和写。为了这个灵活

       æ€§ï¼Œlock将同步互斥控制和等待队列分离开来,互斥保证在某个时刻只有一个线程访问临界区(lock自己完成),等待队列负责保存被阻塞的线程

       ï¼ˆcondition完成)。

       é€šè¿‡æŸ¥çœ‹ReentrantLock的源代码发现,condition其实是等待队列的一个管理者,condition确保阻塞的对象按顺序被唤醒。

       åœ¨Lock的实现中,LockSupport被用来实现线程状态的改变,后续将更进一步研究LockSupport的实现机制。

你应该知道的wait/notify那点事儿

       Java的Object类中的wait()和notify()方法在多线程协作中起着关键作用,它们控制着线程间的源码等待、唤醒和切换。源码首先,源码斗罗大陆源码分享了解线程的源码六种状态:新建、就绪、源码运行、源码阻塞、源码完成。源码接着,源码看一个代码示例:

       看似平凡的源码ios 扫雷 源码代码,却隐藏着问题。源码当不正确使用synchronized时,源码wait()和notify()可能会导致异常。源码这是源码因为wait()需要在同步代码块中调用,以保证线程间的公式源码 v通信原子性,避免被中断。

       当thread2调用wait后,如果thread1不释放锁,其他线程无法进入同步块。wait会释放锁,arpspoof源码解析但唤醒后会重新获取,确保线程在被唤醒后继续执行。从JVM源码看,wait会放弃锁然后等待唤醒,notify则会选择一个线程唤醒,phoenixsuit源码分析并尝试获取锁。

       wait()可能会抛出InterruptedException,因为当其他线程调用interrupt()时,wait会在恢复时检查并抛出异常。调用notify()后,线程并不会立即执行,而是根据JVM的默认策略在同步代码块结束时唤醒。

       至于性能影响,wait和notify使用park/unpark机制,不占用CPU,不影响系统性能。而监视器(Monitor)是每个对象的核心,控制着线程对对象的访问。进入区、拥有者和等待区的概念解释了线程如何在对象锁的控制下交互。

       最后,要注意的是,Thread.sleep()方法会让线程休眠,但不释放监视器,这点与wait和notify不同。

Java 中LockSupport类在C#中的实现

          Java 之后提供优秀的并发库ncurrent Net中缺乏类似的功能 由于硬件体系发生了变化 多核时代来临 NET中缺乏并发类库显然不合时宜 缓解这一矛盾的其中一个办法就是在往C#中移植java的ncurrent

          java中的ncurrent包中提供了一个类LockSupport ncurrent包很多关键实现需要调用LockSupport 如果需要把java的ncurrent包迁移到C#中 LockSupport类的迁移是不可避免的问题

          在java中 LockSupport类有如下方法

          以下是引用片段

          

       

          public static void park(Object blocker) {   Thread t = Thread currentThread();   setBlocker(t  blocker);   unsafe park(false   L);   setBlocker(t  null);   }

          当一个线程调用LockSupport park之后 线程就会停下载 类似于Object wait 或者 NET中的System Threading Monitor Wait 但问题是java中的Object wait和 NET中的Monitor wait 都需要一个waitObject 这个问题曾经困扰我 为此翻了一遍JDK 实现源码 到最后发现的解决办法却是很简单 也无需了解JDK的底层实现源码

          以下是引用片段

          

          public class LockSupport   {   private static LocalDataStoreSlot slot = Thread GetNamedDataSlot ( LockSupport Park );   public static void Park(Object blocker)   {   Thread thread = Thread CurrentThread;   Thread SetData(slot  blocker);   lock (thread)   {   Monitor Wait(thread);   }   }   public static void Unpark(Thread thread)   {   if (thread == null) return;   lock (thread)   {   Monitor Pulse(thread);   }   }   }

lishixinzhi/Article/program/net//

copyright © 2016 powered by 皮皮网   sitemap