`

Java多线程之释放对象的锁

    博客分类:
  • Java
阅读更多

      由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的。在以下情况下,持有锁的线程会释放锁:

1. 执行完同步代码块。

2. 在执行同步代码块的过程中,遇到异常而导致线程终止。

3. 在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放锁,进行对象的等待池。

 

      除了以上情况外,只要持有锁的此案吃还没有执行完同步代码块,就不会释放锁。因此在以下情况下,线程不会释放锁:

1. 在执行同步代码块的过程中,执行了Thread.sleep()方法,当前线程放弃CPU,开始睡眠,在睡眠中不会释放锁。

2. 在执行同步代码块的过程中,执行了Thread.yield()方法,当前线程放弃CPU,但不会释放锁。

3. 在执行同步代码块的过程中,其他线程执行了当前对象的suspend()方法,当前线程被暂停,但不会释放锁。但Thread类的suspend()方法已经被废弃。

 

      避免死锁的一个通用的经验法则是:当几个线程都要访问共享资源A、B和C时,保证使每个线程都按照同样的顺序去访问他们,比如都先访问A,再访问B和C。

 

      java.lang.Object类中提供了两个用于线程通信的方法:wait()和notify()。需要注意到是,wait()方法必须放在一个循环中,因为在多线程环境中,共享对象的状态随时可能改变。当一个在对象等待池中的线程被唤醒后,并不一定立即恢复运行,等到这个线程获得了锁及CPU才能继续运行,又可能此时对象的状态已经发生了变化。

 

    

6
2
分享到:
评论
5 楼 danni505 2009-10-16  
一个线程由于异常而终止,其原持有的对象锁要被释放,那么我想问,这个释放锁是由谁了进行?又是如何进行的?
4 楼 yoyo08 2008-12-10  
ChinaEstone 写道

利用java.utils.concurrent并发工具包可以更好的进行线程间的通信,并且可以很好的控制同步。  

说的对 确实是这样
3 楼 ChinaEstone 2008-12-10  
利用java.utils.concurrent并发工具包可以更好的进行线程间的通信,并且可以很好的控制同步。  
2 楼 yoyo08 2008-12-07  
netbaixc@gmail.com 写道

   
引用
一个wait的线程可能因为jvm本身的实现而自动得去恢复锁的持有,因为有如此的约定,所以一个合乎逻辑的程序都应该在循环体里wait.

wait()也可以带参数的
1 楼 netbaixc_gmail_com 2008-12-07  
   
引用
java.lang.Object类中提供了两个用于线程通信的方法:wait()和notify()。需要注意到是,wait()方法必须放在一个循环中,因为在多线程环境中,共享对象的状态随时可能改变。当一个在对象等待池中的线程被唤醒后,并不一定立即恢复运行,等到这个线程获得了锁及CPU才能继续运行,又可能此时对象的状态已经发生了变化。
  这里说的有点含糊,实际本质原因是因为JVM实现规范里有约定, The thread may be removed from the wait set due to any one of the following actions, and will resume sometime afterward. ~~~An internal action by the implementation. Implementations are permitted, although not encouraged, to perform "spurious wake-ups" -- to remove threads from wait sets and thus enable resumption without explicit instructions to do so. Notice that this provision necessitates the Java coding practice of using wait only within loops that terminate only when some logical condition that the thread is waiting for holds. http://java.sun.com/docs/books/jls/third_edition/html/memory.html意思就是说一个wait的线程可能因为jvm本身的实现而自动得去恢复锁的持有,因为有如此的约定,所以一个合乎逻辑的程序都应该在循环体里wait.

相关推荐

    java多线程机制 -- 源码详解

    java多线程机制: 例子 1 public class Example1 { static Lefthand left;static Righthand right; public static void main(String args[]) { left=new Lefthand(); //创建两个线程。 right=new Righthand();...

    java线程学习笔记

    3. Wait() 方法:使线程进入等待状态,释放锁资源,notify() 或 notifyAll() 唤醒线程,这三个方法必须在获得对象锁的状态下使用,否则报错。 4. IO 阻塞:线程因等待 IO 操作的完成而被阻塞。 线程优先级: 线程...

    Java高级工程师面试宝典

    Java 高级工程师面试宝典中,多线程编程是 Java 程序员面试的重要考点,本文将对 Java 多线程编程的基本概念、线程安全、同步、锁、死锁、等进行详细介绍。 一、进程和线程 进程是所有线程的集合,每一个线程是...

    2020面试题总结多线程篇.pdf

    而调用 wait() 方法会释放对象锁,只有当此对象调用 notify() 方法后才会唤醒线程。 * sleep() 方法可以在任何地方使用,wait() 方法只能在同步方法和同步代码块中配合 synchronized 使用。 * sleep() 方法需要抛出...

    多线程相关面试问题.docx

    多线程编程是 Java 编程中一个非常重要的概念,它可以提高程序的执行效率和响应速度。然而,多线程编程也存在一些挑战,如线程安全、死锁、线程同步等问题。下面我们将对多线程相关面试问题进行总结和解释。 一、...

    Java多线程与并发-原理

    文章目录synchronized线程安全主要诱因互斥锁特性获取对象锁同对象,异步同对象,同步代码块同对象,非静态同步方法同对象,同步代码块 对比 非静态同步方法不同对象,同步代码块 对比 非静态同步方法获取类锁和对象...

    java关键字Synchronized详解

    ava中的关键字synchronized是一种用于实现线程...当一个线程释放偏向锁时,JVM会将其替换为普通锁。这意味着,如果有其他线程正在等待这个对象的锁,它们将不得不重新竞争这个锁。这种竞争可能导致锁膨胀现象的发生。

    Java对象锁

     只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。  每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务可以使用此资源。  2.synchronized同步块  2.1...

    Java八股文的面试题

    多线程和并发: Java支持多线程编程,允许同时执行多个任务。Java中的并发编程机制包括线程、同步、锁等,以及java.util.concurrent包提供的高级并发功能。 异常处理: Java通过异常处理机制提供了一种结构化的错误...

    java笔试题大集合及答案(另附各大公司笔试题)

    调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁...

    一张图读懂Java多线程

     2)何种情况下获取到了锁,何种情况下会释放锁  2、还是那张图  3、详细图解  1)Thread t = new Thread(),初始化一个线程,实际上是一个普通对象,此时他的状态为New  2)t.start(); 线程处于绪...

    BAT面试官有点懵系列,Java多线程你真的理解透彻了吗?带你玩转一次多线程!Let’s go!别再out了!

    文章目录神标题引入线程和进程多线程的优势线程创建方式继承Thread类来创建和启动实现Runnable接口重写run方法创建线程类使用 Callable 和 Future 创建线程三种创建线程方式做出对比线程生命周期线程控制join线程...

    java核心面试技术点

    (5) 释放对象监视器的锁 (unlock) spring框架原理 10. spring工作机制及为什么要用? 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2....

    java核心面试

    (5) 释放对象监视器的锁 (unlock) spring框架原理 10. spring工作机制及为什么要用? 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2....

    Java实现多线程的方法总结

    java 实现多线程的三种方法  在java中,有三种方法可以实现多线程。第一种方法:继承Thread类,重写run函数。第二种方法:实现Runnable接口,重写run函数。第三种方法:实现Callable接口,重写call函数。本文章将...

    Java面试技术面知识扩展包第三弹.rar

    Java是一种通用、跨平台的编程语言,具有以下几个概念和特点: 1. 面向对象:Java是一...5. 多线程支持:Java内置了多线程的支持,可以创建和管理多线程。多线程能够充分利用多核处理器的优势,提高程序的并发性和....

    Java面试技术面知识扩展包第二弹.rar

    Java是一种通用、跨平台的编程语言,具有以下几个概念和特点: 1. 面向对象:Java是一...5. 多线程支持:Java内置了多线程的支持,可以创建和管理多线程。多线程能够充分利用多核处理器的优势,提高程序的并发性和....

    100家大公司java笔试题汇总.docx

    1. Java中的多线程编程是通过Thread类和Runnable接口来实现的。 2. Java中的线程可以是daemon线程,也可以是用户线程,daemon线程是一种特殊的线程,它会在JVM退出时自动销毁。 3. Java中的线程可以通过等待和唤醒...

    lock锁,lock锁和synchronized的对比

    一种显式定义同步锁对象来实现锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock锁。 # synchronized锁与lock锁的对比 Lock是显式锁,需要手动的开启和...

    职工信息管理java实现小demo

    Java是一种广泛应用于软件开发的高级编程语言。它由Sun Microsystems(日后被Oracle收购)的詹姆斯·高斯林(James Gosling)等人于1995年首次发布。Java被设计成一种可移植、面向...5. **多线程**: Java内置对多线程

Global site tag (gtag.js) - Google Analytics