线程的是实现有两种方法:
1: 实现接口: Runnable
2 : 继承类 : Thread
每一个对象都有一个监视器,或者叫做锁。
当线程执行到synchronized的时候,检查传入的实参对象,并得到该对象的锁旗标。如果得不到,那么此线程就会被加入到一个与该对象的锁旗标相关联的等待线程池中,一直等到对象的锁旗标被归还,池中的等待线程就会得到该锁旗标,然后继续执行下去。当线程执行完成同步代码块,就会自动释放它占有的同步对象的锁旗标。一个用于synchronized语句中的对象称为监视器,当一个线程获得了synchronized(object)语句中的代码块的执行权,即意味着它锁定了监视器。
举一个死锁的例子:
public class A
{
synchronized void foo(B b)
{
System.out.println("method in a.foo ;thread name is "+Thread.currentThread().getName());
try{
Thread.sleep(1);
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println("try to call b.last");
b.last();
}
synchronized void last()
{
System.out.println("method in a.last");
}
}
class B
{
synchronized void bar(A a)
{
System.out.println("method in B.BAR ;thread name is "+Thread.currentThread().getName());
try{
Thread.sleep(1);
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println("try to call a.last");
a.last();
}
synchronized void last()
{
System.out.println("method in b.last");
}
}
public class main implements Runnable
{
A a = new A();
B b = new B();
main()
{
Thread.currentThread().setName("MainThread");
new Thread(this).start();
System.out.println("track after start");
a.foo(b);
System.out.println("back in main thread");
}
public void run()
{
System.out.println("track in run");
Thread.currentThread().setName("RacingThread");
b.bar(a);
System.out.println("back in other thread");
}
public static void main(String args[])
{
new main();
}
}
运行结果是:
造成死锁,相互锁定对象!
分享到:
相关推荐
进程、线程、死锁和POSIX规范的系统调用 进程是操作系统中一个独立的执行单元,它拥有自己的虚拟地址空间和系统资源。线程是轻量级的进程,它共享同一个进程的虚拟地址空间和系统资源。理解进程和线程的概念对于...
但是,过度使用synchronized可能导致死锁,即两个或更多线程相互等待对方释放资源,造成僵局。为避免死锁,应合理设计锁的顺序和超时策略。 Java提供了多种传递数据到线程的方法。首先,可以通过构造函数传递参数,...
明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。
基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...
### Java多线程死锁预防机制研究 #### 摘要 随着计算机技术的发展和软件系统日益复杂的背景下,多线程编程技术得到了广泛的应用。多线程能够显著提高程序的执行效率,但也随之带来了诸如死锁等问题。死锁是指两个或...
Java多线程编程是开发高并发应用的关键技术之一,但随之而来的是各种复杂的问题,其中最令人头疼的就是死锁。死锁是指两个或多个线程相互等待对方释放资源,导致它们都无法继续执行的情况。JCarder是Java中用于检测...
线程死锁是多线程编程中一个严重的问题,它发生在两个或多个线程相互等待对方释放资源,导致它们都无法继续执行。这个概念在计算机科学中尤为重要,因为并发执行是提高系统性能的关键手段,但如果不妥善处理,死锁...
DllMain 和多线程死锁 DllMain 是可选择的 DLL 入口指针,当进程和线程启动和终止时被系统调用,分别进行创建资源和释放资源等操作。在 DllMain 中创建线程或结束线程时,都特别要注意一个规则,那就是 DllMain 的...
JAVA源码Java多线程程序死锁检查JCarder
- **死锁检测与恢复**:使用Java 1.6及以上版本提供的`java.util.concurrent.locks.Condition`类,可以实现检测到死锁后进行恢复的操作。 - **资源排序**:确保所有线程都按照同一顺序请求资源,可以避免死锁。 6...
在Java多线程编程中,死锁是一个非常重要的概念,也是开发者需要密切关注和避免的问题。死锁是指两个或多个线程互相等待对方释放资源,从而导致它们都无法继续执行的状态。这种情况通常发生在并发环境中,当线程间的...
5. **JCarder工具**:`JCarder`是一个专门针对Java多线程死锁的检测工具,它通过分析线程的同步状态和资源持有情况,找出可能存在的死锁链。 三、JCarder的使用与原理 6. **使用方法**:首先,将`JCarder`工具集成...
0708_极智开发_解读多线程之死锁分享
java资源Java多线程程序死锁检查 JCarder提取方式是百度网盘分享地址
在本资料“基于java的多线程程序死锁检查 JCarder.zip”中,我们将探讨如何利用JCarder工具来检测和预防Java多线程死锁。 首先,让我们理解死锁的基本条件。在Java中,当满足以下四个条件时,就可能出现死锁: 1. ...
一个简单有效的即时检测线程死锁的方法(附c++源代码) 原文链接:https://blog.csdn.net/liaozhilong88/article/details/80354414 原链接是windows下实现,这份代码以pthread简单实现跨平台 感谢原博主分享
Java多线程编程是开发高并发应用的关键技术之一,但同时也带来了复杂性和潜在的问题,比如死锁。死锁是指两个或多个并发线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,它们都将无法推进...
多线程死锁的危险 - 临界区函数的不当使用 在多线程编程中,临界区函数的使用是非常重要的。然而,许多开发者却忽视了临界区函数的正确使用方法,导致了多线程死锁的出现。本文将讲述一个关于在类的构造函数和析构...
### Java多线程技术详解 #### 一、引言 多线程编程是现代软件开发中不可或缺的一部分,尤其是在Java这样的面向对象编程语言中尤为重要。Java提供了丰富的API支持多线程编程,使得开发者能够轻松地创建复杂的并发...