package thread;
public class Test implements Runnable {
public Object 吃西餐先拿;
static Object 刀 = new Object();
static Object 叉 = new Object();
public static void main(String[] args) {
ChildClass c = new ChildClass();
c.f();
System.out.println("不会死锁,这种机制叫重进入!");
//--------重进入例子---------------
//---------死锁例子---------------
Test 丈夫 = new Test();
Test 妻子 = new Test();
丈夫.吃西餐先拿 = 刀;
妻子.吃西餐先拿 = 叉;
Thread t1 = new Thread(丈夫);
Thread t2 = new Thread(妻子);
t1.start();
t2.start();
}
public void run() {
if (吃西餐先拿 == 刀) {
synchronized (刀) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
synchronized (叉) {
System.out.println("1");
}
}
}
if (吃西餐先拿 == 叉) {
synchronized (叉) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
synchronized (刀) {
System.out.println("0");
}
}
}
}
}
class ParentClass extends Thread {
public synchronized void f() {
}
}
class ChildClass extends ParentClass {
public synchronized void f() {
super.f();
}
}
子类的重写同步方法f中又调用了父类的同步f方法 这时不会对调用的该对象死锁,可以理解为不会上第二个锁 也可以理解为第二把锁没有加上去。总而言之 sychronized关键字的本质是不让其他线程在同一对象上再上一把锁。
分享到:
相关推荐
在编程领域,线程同步是多线程编程中的一个核心概念,它涉及到如何有效地管理和协调多个并发执行的线程,确保它们能正确地共享资源,避免数据竞争和死锁等问题。这个“线程同步小例子”是基于孙鑫先生著作中的示例...
4. 检测和恢复:通过算法检测是否即将进入死锁状态,并采取措施,如回滚事务,释放部分锁等。 "Java.jpg"文件可能是一个关于死锁的流程图或者示意图,帮助直观理解死锁的发生过程。 总之,理解并避免Java中的死锁...
正确理解和使用它们可以提高程序的并发性能,同时避免数据竞争和死锁等问题。通过Windows API或C++标准库提供的工具,我们可以方便地在C++中实现线程和线程锁的功能。在实际项目中,根据具体需求选择合适的同步机制...
本文将深入探讨标题和描述中提到的“多线程的小例子”以及线程互斥的概念。 线程互斥是多线程编程中的一个关键概念,用于确保在特定时间内,只有一个线程可以访问共享资源,以防止数据不一致性和竞态条件。在C#中,...
总结来说,Java线程死锁是并发编程中需要特别关注的问题,理解死锁产生的原因和条件,以及如何避免和处理死锁,是提升程序稳定性和性能的关键。通过合理设计资源获取顺序,使用线程通信机制,我们可以有效地防止和...
在分析和设计多线程应用程序时,应充分考虑线程同步策略,避免死锁、活锁和饥饿等问题的发生。通过实践和调试这些典型的C#线程同步例子,你可以深入理解各种同步机制的工作方式,并学会在实际项目中灵活运用。
线程的暂停通常使用suspend()和resume(),但这些方法存在死锁风险,因此现在多使用Thread类的interrupt()方法配合isInterrupted()或InterruptedException来实现线程的暂停和恢复。 线程同步是解决多线程间数据安全...
7. **线程池**:为提高性能和资源利用率,Java提供了`ExecutorService`和`ThreadPoolExecutor`,可以预先创建线程池,管理和复用线程,避免频繁创建和销毁线程的开销。 8. **线程间的通信**:Java的`BlockingQueue`...
- 临界区是另一种同步机制,它提供了一个简单的方法来保护一小段代码,防止多个线程同时执行。使用`EnterCriticalSection`进入临界区,`LeaveCriticalSection`离开临界区,`TryEnterCriticalSection`尝试进入,如果...
Monitor对象提供了Enter和Exit方法,用于进入和退出临界区,实现线程间的同步;而Lock语句是C#提供的语法糖,它实际上是基于Monitor的。 UI线程(用户界面线程)是处理用户交互的线程,如Windows Forms或WPF应用...
Java线程是并发编程的核心部分,它允许程序同时执行多个任务,从而提高系统效率和响应速度。...以上知识点涵盖了Java线程的基本概念、操作和高级特性,通过这些例子,开发者可以深入理解并熟练运用Java的并发编程技术。
在给定的“boost库的线程例子和互斥锁”中,我们可以深入探讨两个关键概念:Boost.Thread库以及互斥锁(Mutex),这些都是多线程编程中的核心元素。 首先,Boost.Thread库是Boost库的一部分,它为C++程序员提供了对...
本文将深入解析MFC多线程的基础概念,并通过具体的例子来帮助你理解和应用。 **多线程基础** 多线程是指在一个进程中可以同时运行多个独立的执行流,每个执行流被称为一个线程。在MFC中,我们可以使用`CWinThread`...
在IT领域,多线程是一种常见的编程模型,它允许程序同时执行多个独立的任务,从而提高系统资源利用率和...通过这个例子,开发者可以学习到如何在实际项目中有效地利用多线程和同步机制,提升程序的并发性能和可扩展性。
(2)**单线程重复申请锁**:在`data_process()`和`sub_func()`的例子中,`sub_func()`已经获取了锁,但`data_process()`再次尝试获取相同的锁,这可能导致死锁,因为`LeaveCriticalSection()`不会被调用,除非所有...
- 在多线程环境中,必须注意线程安全问题,避免数据竞争和死锁。使用同步机制和原子操作确保对共享资源的正确访问。 6. **示例分析**:"delphi7第一个线程例子"可能演示了如何创建一个简单的线程,展示如何在...
在Java多线程编程中,还需要注意线程安全问题,例如避免数据竞争和死锁。使用`synchronized`关键字可以实现线程之间的互斥访问,`volatile`关键字可以保证变量的可见性。此外,还可以使用`java.util.concurrent`包中...
4、阻塞状态:线程被暂停执行,可能是因为等待 I/O 操作完成,或者调用了 `sleep()`、`join()` 或者 `synchronized` 代码块,导致线程进入等待状态。 5、等待/定时等待状态:线程调用了 `wait()`、`await()` 或 `...
在这个例子中,有两个线程`thread-1`和`thread-2`,它们分别持有锁`lock1`和`lock2`,并试图获得对方所持有的锁。具体步骤如下: 1. `thread-1`首先获得`lock1`锁,并输出“thread-1 locks lock1”。 2. `thread-1`...
同步线程则是指通过特定机制(如锁)来控制多个线程访问共享资源的顺序,避免出现竞态条件和死锁。 在Java中,线程的创建可以通过继承`Thread`类或实现`Runnable`接口。线程的主体行为定义在`run()`方法中,当`...