0 0

Java线程的sleep持有的是谁的锁?5

如果sleep持有的是this锁,为何在子线程打印出“睡眠”后,主线程调用abc方法时仍能打印数字。
按我的理解,由于主线程和子线程使用同一个对象mickey,互斥访问mickey的锁,所以打印出“睡眠”后,应该在打印“醒来”时中间不能执行abc的打印输出。
public class SleepLockDem extends Thread {
private Object obj = new Object();
public void run() {
synchronized (obj) {
System.out.println("睡眠");
try {
sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("醒来");
}
}

public synchronized void abc() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}

public static void main(String[] args) {
SleepLockDem mickey = new SleepLockDem();
mickey.start();
mickey.abc();
}
}

问题补充:
关于sleep和wait的区别网上经常有这样的的说法
最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
我就是想验证“sleep方法没有释放锁”。
2009年7月27日 15:18

5个答案 按时间排序 按投票排序

0 0

或许你想要的是这个效果:

public class TestThread extends Thread {

	private TestObj obj = new TestObj();

	public void run() {
		synchronized (obj) {
			System.out.println("睡眠");
			try {
				sleep(10000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("醒来");
		}
	}

	public void abc() {
		System.out.println("runabc");
		obj.abc();
	}

	public static void main(String[] args) {
		TestThread mickey = new TestThread();
		mickey.start();
		try {
			sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		mickey.abc();
	}

}

class TestObj {
	public synchronized void abc() {
		for (int i = 0; i < 100; i++) {
			System.out.println(i);
		}
	}
}

2009年7月31日 13:11
0 0

run 方法是用obj作为锁对象,而abc方法使用this作为锁。不存在竞争锁的问题。。。

2009年7月28日 10:18
0 0

线程中锁的是内部Object对象的实例,而运行的abc是SleepLockDem的实例方法没有被锁

2009年7月27日 16:49
0 0

sleep持有锁吗?跟锁没有关系吧。
锁是用来锁住共享资源的,sleep是暂停线程,并没有跟别的线程抢共享资源。

2009年7月27日 16:21
0 0

当前的线程持有锁.

2009年7月27日 15:35

相关推荐

    Java多线程知识点总结

    当一个线程试图进入一个已经被另一个线程持有的同步代码块时,它将进入阻塞状态,直到同步代码块的执行线程释放锁。同样,当线程使用wait方法时,它会主动释放锁并进入等待状态,直到其他线程调用notify或notifyAll...

    Java线程学习和总结

    本文将深入探讨Java线程的核心概念、API以及在实际开发中的应用,旨在帮助你理解和掌握这一关键技能。 首先,我们需要了解什么是线程。在单核CPU系统中,线程是操作系统调度的基本单位,而在多核CPU系统中,每个...

    java多线程编程总结

    #### 五、Java线程:线程的同步与锁 - **线程同步** 线程同步的主要目的是解决多线程环境下的资源共享问题,确保资源的安全访问。Java提供了多种同步机制,包括但不限于: 1. **同步方法**:通过在方法声明上...

    Java线程基础教程完整版

    Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应性。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)管理。本教程将深入讲解Java线程的基础知识,帮助你掌握多...

    java线程线程安全同步线程

    Java线程是多线程编程的核心概念,是Java语言中实现并发执行的机制。线程安全和同步线程是确保在多线程环境下正确执行的关键因素。线程安全指的是一个方法或类在多线程环境下可以正确无误地运行,不会因为线程之间的...

    Java多线程编程总结

    #### 五、Java线程:线程的同步与锁 1. **线程同步** - 线程同步是指控制多个线程对共享资源的访问,确保一次只有一个线程能够访问共享资源。 - 同步机制包括使用同步方法、同步代码块以及显式锁。 2. **锁** -...

    java sleep()和wait()

    需要注意的是,在调用`sleep()`方法时,线程不会释放它所持有的任何锁资源,这意味着如果当前线程持有一个对象的锁,则其他等待该锁的线程仍然会处于阻塞状态。 ##### 1.2 方法签名 ```java public static void ...

    JAVA多线程学习内容

    避免死锁的方法包括避免持有多个锁、避免循环等待和使用死锁检测算法。 线程安全是多线程编程中的另一个重要概念,指在多线程环境下,类的行为不会因线程的并发执行而变得不确定。Java提供了一些线程安全的数据结构...

    15个Java线程并发面试题和答案.docx

    3. **wait()与sleep()的区别**:`wait()`方法会让线程释放持有的锁并进入等待状态,而`sleep()`不会释放锁,只是让线程暂停一段时间。`wait()`主要用于线程间的通信,`sleep()`则用于让线程短暂休眠。 4. **阻塞...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    当一个线程调用`wait()`时,它会释放当前持有的锁并进入等待状态,直到其他线程调用`notify()`或`notifyAll()`唤醒它。这种机制常用于实现生产者消费者模型或者哲学家就餐问题等经典并发问题。 2. **线程的停止** ...

    Java的多线程-线程间的通信.doc

    - `wait()`方法会使当前线程进入停滞状态,并释放它持有的所有锁,直到其他线程调用同一对象的`notify()`或`notifyAll()`方法唤醒它。调用wait()的线程必须持有对象的锁,否则会抛出`IllegalMonitorStateException`...

    Java 线程开发讲座

    #### 五、Java线程:线程的同步与锁 - **同步机制**:同步机制是为了防止多个线程同时访问同一资源而导致的数据不一致问题。 - **锁**:锁是一种常用的同步工具,分为内置锁(synchronized关键字)和显式锁...

    Java线程Dump分析工具jstack解析及使用场景

    Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...

    Java多线程运算集合

    #### 十二、Java线程:新特征-锁(上)与锁(下) - **锁的新特性**: - Java 5引入了新的锁机制,如 `ReentrantLock`、`ReadWriteLock` 等。 - 这些锁机制提供了比传统的 `synchronized` 更加灵活和强大的功能。...

    Java线程的同步与死锁

    ### Java线程的同步与死锁 #### 一、引言 在Java中,多线程编程是一项重要的技术,能够显著提升程序的性能和响应能力。然而,随着线程数量的增加,线程间的同步问题变得越来越复杂。本文将深入探讨Java线程中的同步...

    Java多线程——线程八锁案例分析.docx

    3. 使用`Thread.sleep()`可以让线程暂停指定的时间,但不会影响锁的持有状态,其他线程仍需等待锁被释放。 4. 如果有多个线程需要访问共享资源,即使其中某些操作不涉及同步,也应考虑整体的并发控制策略,以防止...

    java多线程源码,仅供参考

    `wait()`和`notify()`是对象级别的锁控制,用于线程间的通信,一个线程调用`wait()`会释放当前持有的锁并等待,而其他线程调用`notify()`或`notifyAll()`可以唤醒等待的线程。 "BounceThread"这个示例可能涉及到...

    Java多线程的总结

    Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...

    多线程sleep,yield,wait区别

    - `sleep()` 不会释放对象锁,因此如果线程持有锁,它在睡眠期间仍然保持锁定状态。 - 使用 `sleep()` 可以避免线程过度占用CPU资源,提高其他线程的执行机会。 - 该方法可能会抛出 `InterruptedException`,如果...

    Java线程及多线程技术及应用.pdf

    Java线程及多线程技术是Java语言并发编程的核心内容,也是构建高并发系统不可或缺的一部分。下面将根据提供的文件内容,详细说明其中涉及的知识点。 1. Java线程的基本概念 Java中的线程是一种轻量级的执行单元,...

Global site tag (gtag.js) - Google Analytics