`
hunter090730
  • 浏览: 194636 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

线程中释放锁的方式

    博客分类:
  • java
阅读更多

# 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。
  
  # 调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {...} 代码段内唤醒A。
  
  # 当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。
  
  # 如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。
  
  # obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。
  
  # 当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。
  
  wait()/sleep()的区别
  
  前面讲了wait/notify机制,Thread还有一个sleep()静态方法,它也能使线程暂停一段时间。sleep与wait的不同点是:sleep并不释放锁,并且sleep的暂停和wait暂停是不一样的。obj.wait会使线程进入obj对象的等待集合中并等待唤醒。
  
  但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException。
  
  如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
  
  需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到wait()/sleep()/join()后,就会立刻抛出InterruptedException。

分享到:
评论

相关推荐

    vc++中的线程锁(线程锁保持线程同步)

    访问完毕后,必须释放锁。如果一个线程在持有锁的情况下崩溃,其他线程可能会永久阻塞,这被称为死锁。为了避免这种情况,开发者需要谨慎设计锁的使用逻辑,遵循一些最佳实践,如避免嵌套锁,尽可能减少锁的持有时间...

    CVI 线程锁、线程安全变量实例

    如果获取失败,线程进入等待状态,直到其他线程释放锁。线程安全变量则可以确保在多线程环境下,即使不使用锁,也可以安全地更新和读取这些变量。 在LabWindows/CVI的`多线程_线程锁_线程安全变量`示例中,你可能会...

    易语言线程安全之原子锁与读写锁

    4. 持有锁的线程释放锁后,其他线程按照等待顺序获取锁。 在易语言中,我们可以通过调用相应的API函数或者使用易语言提供的类库来实现读写锁。使用时,线程需要先尝试获取读锁或写锁,成功后执行相关操作,最后释放...

    线程和线程锁的使用源码例子

    在函数内部,`WaitForSingleObject`用于尝试获取互斥锁,`ReleaseMutex`用于释放锁。这样,两个线程将交替执行,确保对共享资源的独占访问。 总结起来,线程和线程锁在多线程编程中起着至关重要的作用。正确理解和...

    java多线程之并发锁

    ReentrantLock 是一个可重入锁,这意味着线程可以多次获取同一个锁,直到线程释放所有的锁。ReentrantLock 的锁机制可以防止线程死锁和饥饿的发生。 FoodCenter 类和 ThreadDog、ThreadPig 类都是使用 Lock 机制来...

    C#内存释放-线程控制-线程启动-线程暂停

    本文将深入探讨“C#内存释放-线程控制-线程启动-线程暂停”这一主题,结合提供的WFormsThread文件,我们可以假设这是一个关于Windows Forms应用程序中线程管理的实例。 首先,让我们关注线程控制。在C#中,我们通常...

    线程锁的用法

    在Windows系统编程中,`CCriticalSection`类是实现线程锁的一种方式,它提供了一种线程同步机制,确保同一时间只有一个线程可以访问特定的代码段或数据。 `CCriticalSection`是Microsoft的Active Template Library ...

    python3之多线程及线程锁的基础用法

    在这个例子中,`lock.acquire()` 用于获取锁,`lock.release()` 用于释放锁。当一个线程持有锁时,其他试图获取相同锁的线程将会被阻塞,直到锁被释放。通过这种方式,可以确保对共享资源的安全访问。 #### 示例...

    多线程互斥锁和条件变量demo

    当一个线程获取了互斥锁后,其他试图获取该锁的线程将被阻塞,直到持有锁的线程释放锁。这样,同一时间只有一个线程能够访问受保护的代码或数据,避免了数据竞争和不一致的情况。在C或C++中,我们可以使用pthread库...

    线程互斥锁

    测试代码通常会包含一系列的线程操作,如创建线程、获取锁、释放锁、等待和退出线程等,以验证互斥锁的功能是否正常工作。Makefile是用来编译和链接这些测试代码的自动化脚本,包含了编译指令和依赖关系,使得在不同...

    C++实现线程锁

    当条件不满足时,线程会被阻塞并释放锁,条件满足时通过`notify_one()`或`notify_all()`唤醒等待的线程。 ```cpp #include std::condition_variable cv; std::mutex cv_m; bool ready = false; void waiting_...

    39.线程间的通信-wait与notify-wait方法自动释放锁与notify方法不会释放锁.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    MFC线程获取锁

    在编程领域,特别是涉及到多线程编程时,同步机制至关重要,因为它们确保了对共享资源的正确访问。在Microsoft Foundation Class (MFC) 库中,...在实际开发中,务必确保正确地释放锁,避免潜在的竞态条件和死锁问题。

    线程进程互斥锁

    当一个线程获取了互斥锁后,其他试图获取该锁的线程将会被阻塞,直到持有锁的线程释放锁。 - **工作原理**:获取锁的线程会在操作共享资源前先尝试锁定,如果成功则进行操作;完成后解锁,允许其他等待的线程获取。...

    线程的各种使用方式Demo

    - **wait()与notify()**:在同步控制中,线程可以通过`wait()`释放同步锁进入等待状态,其他线程通过`notify()`唤醒等待的线程。 - **Lock接口与ReentrantLock类**:提供比`synchronized`更细粒度的锁控制,如公平...

    线程与互斥锁的应用

    其他试图获取锁的线程将被阻塞,直到持有锁的线程释放它。 在这个具体的例子中,echo线程和cat线程都试图读取IMEI。如果两个线程同时进行,可能会导致IMEI读取的混乱,比如一个线程可能只读取到IMEI的一部分,或者...

    Delphi XE10.2.3多线程大量读和少量写公共资源时,用原子自旋读写锁代替互斥锁提高效率

    对于一个高性能服务器在处理多数读取,少量写入的场景时,如果还是使用常规的互斥锁方式,显然就不...写完释放锁,所有读取线程又并发读取,详细内容请见:https://blog.csdn.net/u013420701/article/details/79912242

    多线程入门,分布式锁,等相关资料

    总结来说,本资源包提供的"多线程入门资料"涵盖了多线程的基本概念、实现方式、线程同步与通信、并发问题及其解决方案,以及分布式锁的原理与实现,是学习Java多线程和分布式系统的好助手。通过深入学习和实践,...

    线程间同步机制 读写锁通信机制 线程与信号

    释放锁只能由持有它的线程执行。在C语言中,互斥锁的API包括`pthread_mutex_init`(初始化)、`pthread_mutex_lock`(加锁)、`pthread_mutex_unlock`(解锁)、`pthread_mutex_trylock`(尝试加锁,不阻塞)和`...

    CVI 03.多线程数据保护(线程锁)

    线程锁的基本概念是基于互斥,即当一个线程持有了锁,其他试图获取该锁的线程将会被阻塞,直到持有锁的线程释放它。这样,对共享资源的访问就变得有序,避免了竞态条件的发生。在C++中,我们可以使用`std::mutex`来...

Global site tag (gtag.js) - Google Analytics