public class TestThread implements Runnable {
public int flag = 1;
static Object o1 = new Object();
static Object o2 = new Object();
@Override
public void run() {
System.out.println("flag" + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
TestThread td1 = new TestThread();
TestThread td2 = new TestThread();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}
线程t1运行的时候他锁定了o1,然后等待sleep1000以后准备锁定o2。可是在他sleep的时候t2已经锁定了o2,同时t2也等待o1.这样就出现了死锁。他们谁也不会得到另一个Object。
面试题的一个例子:
public class TestThread implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
Thread.sleep(5000);
b = 1000;
System.out.println("b = " + b);
}
public void m2() {
System.out.println(b);
}
@Override
public void run() {
try {
m1();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TestThread t1 = new TestThread();
Thread t = new Thread(t1);
t.start();
Thread.sleep(1000);
t1.m2();
}
}
运行结果:
100
b = 1000
从运行结果来看,m2方法被调用了。说明m1被锁定了,但是线程可以访问那些没有被锁定的方法。如果从m2改变b的值也是可以的。
分享到:
相关推荐
在Java编程中,死锁是并发编程中一个重要的概念,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。这个例子中,我们将会深入探讨死锁的产生、识别以及如何避免它。 首先,让我们理解...
在Java编程中,死锁(DeadLock)是一个重要的并发控制问题,它发生在两个或多个线程互相持有对方需要的资源并等待对方释放时,导致所有线程都无法继续执行的情况。死锁是多线程编程中需要特别注意和避免的问题,因为...
Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)来管理和调度。理解并熟练掌握Java线程的创建、控制以及...
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关...第五章 Java线程编程的例子 第六章 Java线程调度 第七章 Java线程调度例子 第八章 和同步相关的高级主题 第九章 多处理器机器上的并行化 第十章 线程组
本文将通过三个实用的例子,讲解 Java 多线程的基本概念和使用方法。 第一个例子:创建多线程 在 Java 中,可以通过继承 Thread 类或实现 Runnable 接口来创建多线程。在第一个例子中,我们将继承 Thread 类来创建...
4. **线程状态**:Java线程有五种状态:新建、可运行、运行、阻塞和死亡。了解这些状态可以帮助开发者更好地控制和调试线程。 5. **线程优先级**:每个线程都有一个优先级,Java中从1(`MIN_PRIORITY`)到10(`MAX_...
一个详细讲解JAVA_线程同步与死锁的例子 希望可以帮助到你。
Java编程中的线程调度与死锁避免是多线程编程中的关键概念,它们对于系统性能和稳定性至关重要。本文将深入探讨这两个主题,并通过一个简单的Eclipse项目实例来演示如何在实践中应用。 首先,我们来看看线程调度。...
三、线程死锁的解决办法: 要解决线程死锁的问题,我们可以采取以下几种方法: 1. 避免嵌套锁定:在编写代码时,我们应该避免嵌套锁定,以免造成线程死锁。 2. 使用锁定的顺序:在编写代码时,我们应该使用锁定的...
本文主要介绍了java线程死锁代码示例,分享了一个简单线程死锁的例子,需要的朋友可以参考下。以下是对该示例的详细解释和知识点总结: 1. 死锁的概念:死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 ...
Java多线程之死锁的出现和解决方法 死锁是指多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不能正常运行。死锁的出现是由于不适当地运用“synchronized”...
### Java线程的同步与死锁 #### 一、引言 在Java中,多线程编程是一项重要的技术,能够显著提升程序的性能和响应能力。然而,随着线程数量的增加,线程间的同步问题变得越来越复杂。本文将深入探讨Java线程中的同步...
Java线程同步是一种控制多个线程访问共享资源的方式,确保数据的一致性和完整性。在这个例子中,我们将讨论如何使用`synchronized`关键字实现线程同步,以及它的工作原理。 首先,我们有两个类`ThreadDemo`和`...
在本示例中,我们将深入探讨Java多线程死锁的概念,并通过一个具体的代码示例来理解其工作原理和避免策略。 首先,我们来看标题中的关键点——“Java多线程死锁示例”。死锁是多线程编程中的一种异常状态,通常发生...
第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 何时调度是重要的 调度和线程优先级 ...
这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...
Java线程在其生命周期中会经历多种状态: 1. **新状态(New)**:线程对象已创建,但尚未调用`start()`方法。 2. **可运行状态(Runnable)**:线程已准备好执行,等待CPU时间片分配。 3. **阻塞状态(Blocked)**:线程...
七、线程死锁 八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、...
Java 多线程中的死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于 synchronized 的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死...
Java线程死锁实例及解决方法 Java线程死锁是一种特殊的线程状态,发生死锁时,多个线程会相互等待,无法继续执行,直到外部干预。下面是Java线程死锁实例及解决方法的详细介绍。 一、死锁的定义 所谓死锁是指多个...