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多线程编程总结

    Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    Java多线程编程总结

    Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:...

    Java线程讲解Java线程讲解

    Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解

    java面试题_多线程(68题).pdf

    1. 什么是线程? 2. 什么是线程安全和线程不安全? 3. 什么是⾃旋锁? 4. 什么是CAS? 5. 什么是乐观锁和悲观锁? 6. 什么是AQS? 7. 什么是原⼦操作?在Java Concurrency API中有哪些原⼦类(atomic classes)? 8. ...

    Java线程详解大全

    Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程

    Java线程Java线程Java线程Java线程

    Java线程Java线程Java线程Java线程Java线程Java线程

    4种常用Java线程锁的特点,性能比较、使用场景.pdf

    4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...

    Java 线程总结

    Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的...

    java最新高薪面试题库.docx

    Java中的垃圾回收是如何实现的? Java中的锁机制有哪些?它们有什么区别? 什么是线程安全?在Java中如何实现线程安全? 什么是继承?Java中的继承有哪些特点? 什么是多态?Java中的多态有哪些实现方式? 什么是...

    java 线程java 线程

    java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程

    java线程 线程学习资料 java线程教程

    java线程 线程 教程 java线程教程 java线程学习资料 本教程有什么内容? 本教程研究了线程的基础知识— 线程是什么、线程为什么有用以及怎么开始编写使用线程的简单 程序。 我们还将研究更复杂的、使用线程的应用...

    Java线程模块Java线程之秒表

    Java线程模块Java线程之秒表新手学习Java线程模块时,利用Java中设置线程的暂停间隔,做的简易秒表

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    java 多线程设计模式 进程详解

    为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 访问线程 线程的启动、停止和连接 总结 第三章 同步技术 银行的例子 异步读取数据 一个进行...

    Java线程面试题大全.docx

    3. 如何在 Java 中实现线程? 4. 用 Runnable 还是 Thread? 5. Thread 类中的 start () 和 run () 方法有什么区别? 6. Java 中 Runnable 和 Callable 有什么不同? 7. Java 中 CyclicBarrier 和 CountDownLatch 有...

    java多线程的条件对象和锁对象demo

    利用锁对象和条件对象实现了对线程的控制,具体的讲解可以参考我的博客

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

Global site tag (gtag.js) - Google Analytics