1.Lockçawait/singal å Objectçwait/notify çåºå«
2.你应该知道的源码wait/notify那点事儿
3.Java ä¸LockSupportç±»å¨C#ä¸çå®ç°
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()方法在多线程协作中起着关键作用,它们控制着线程间的源码等待、唤醒和切换。源码首先,源码小猪短租源码了解线程的源码六种状态:新建、就绪、源码运行、源码阻塞、源码完成。源码接着,源码看一个代码示例:
看似平凡的源码带权限管理的java源码代码,却隐藏着问题。源码当不正确使用synchronized时,源码wait()和notify()可能会导致异常。源码这是源码因为wait()需要在同步代码块中调用,以保证线程间的易语言编写文库管理源码通信原子性,避免被中断。
当thread2调用wait后,如果thread1不释放锁,其他线程无法进入同步块。wait会释放锁,抚州无糖溯源码燕窝但唤醒后会重新获取,确保线程在被唤醒后继续执行。从JVM源码看,wait会放弃锁然后等待唤醒,notify则会选择一个线程唤醒,大智慧的筹码源码并尝试获取锁。
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//