`
wanly3643
  • 浏览: 23608 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

两个synchronized方法可以相互调用吗

阅读更多
今天写程序的时候遇到一个问题:两个synchronized方法可以相互调用吗?略微搜索一下,发现有人跟我说不可以,理由是会死锁,大致意思就是A()方法占有了锁,调用B方法的时候需要等待,会形成死锁。我特地写了小程序验证了一下,程序如下

package test;

public class TestSync {

	public synchronized void A()
	{
		System.out.println("A");
		B();
	}

	private synchronized void B()
	{
		System.out.println("B");
	}
	
	public static void main(String[] args)
	{
		TestSync test = new TestSync();
		test.A();
	}
}


运行main方法,发现是可以顺利执行的。
后来想想,其实道理很简单,每个synchronized都是公用一个锁,A()方法在调用B()时自己已经有了这个公用的锁,当然不用等待了。
或者说得干脆点,总共就一把锁,根本不符合死锁的条件,形成死锁起码要两把锁。
0
3
分享到:
评论
1 楼 houxinyou 2011-03-03  
你都说是互相调用了,那么应该在B中也调用A,而且测试的时候应该用多线程,一个线程调用函数A,一个线程调用函数B,如果是为了方便看效果,应该再在两个函数中都加个几秒的延时。

相关推荐

    java 两个线程相互顺序输出

    标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...

    使用synchronized实现多线程同步[借鉴].pdf

    在上述例子中,如果两个线程`t1`和`t2`分别属于两个`ThreadTest`对象实例`r1`和`r2`,它们可以同时调用`run()`方法,因为每个对象都有自己的锁,不会相互影响。但如果`t1`和`t2`都属于同一个`ThreadTest`实例`r`,...

    java基本教程之synchronized关键字java多

    `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时执行同一段代码,可能导致的数据不一致问题。 1. 同步方法:当在方法声明前加上`synchronized`时,整个方法...

    Java多线程中使用synchronized说明

    如果去掉`read2`方法的`synchronized`关键字,那么两个线程可以并行地进入`read2`方法,导致输出交错。这是因为没有了锁的保护,线程间的执行顺序无法保证,可能出现数据竞争。 3. **锁定对象实例 (`this`)**: ...

    java两个线程互相守护

    总结来说,"java两个线程互相守护"涉及到了Java线程的同步和通信机制,通过`wait()`、`notify()`方法以及共享监视器对象,可以实现线程间的有序交互。这种机制在多线程编程中广泛使用,以确保线程安全和程序的正确性...

    Java调用动态链接库通用方法.doc

    在现代软件开发过程中,不同编程语言间的相互调用十分常见。例如,在Java程序中调用C语言编写的动态链接库(Dynamic Link Library,简称DLL),能够充分利用底层语言的性能优势,同时保持Java程序的高级特性。本文将...

    Java 多线程synchronized关键字详解(六)

    因此,即使有多个线程(如`Thread1`和`Thread2`)分别调用这两个方法,它们也会按照锁的获取顺序依次执行,不会同时执行。 3. **同步块(Synchronized Blocks)**: 除了同步方法,还可以使用`synchronized`关键字...

    PHP pthreads v3下同步处理synchronized用法示例

    这两个方法允许线程间进行通信,`wait()`使当前线程进入等待状态,直到其他线程调用`notify()`唤醒它。以下是一个使用`notify()`和`wait()`的例子: ```php class Task extends Thread { public $flag = 1; // .....

    java线程同步的例子.doc

    `ThreadDemo`实现了`Runnable`接口,其中包含两个版本的线程同步:一个是通过`synchronized`方法,另一个是通过`synchronized`代码块。 1. **synchronized代码块**: 在`ThreadDemo`的第一个实现中,`sale()`方法...

    java多线程设计模式.docx

    - **死锁**:两个或更多线程相互等待对方释放资源而造成的一种僵局。避免死锁的关键是避免循环等待,合理设计线程的资源获取顺序。 - **活锁与饥饿**:活锁是线程虽然没有死锁,但仍然无法继续执行的情况;饥饿则...

    27道顶尖的Java多线程、锁、内存模型面试题!.pdf

    例如,一个线程在持有对象锁的情况下,调用了该对象的另一个synchronized方法,如果锁不支持重入,线程将无法继续执行,可能导致死锁。对于Synchronized来说,由于在获取锁时会检查是否已经持有该锁,因此它是可重入...

    java同步详解[归类].pdf

    例如,如果两个线程同时调用同一个对象的同步方法,一个线程会获取到对象的锁,执行方法,而另一个线程则必须等待锁的释放。 ```java public synchronized void method() { // 代码块 } ``` 2. **同步代码块*...

    java面试宝典2014版

    两个方法是否同步取决于它们是否使用了`synchronized`关键字或锁。 ### 50. 多线程与同步的实现 多线程可以通过实现`Runnable`或继承`Thread`来实现,同步可以通过`synchronized`关键字、`ReentrantLock`或其他锁...

    java锁机制详解.pdf

    - **死锁**:两个或多个线程相互等待对方释放资源,导致都无法继续执行的状态。 - **活锁**:线程不断地尝试获取资源,但由于其他线程不断地改变状态,导致线程无法执行。 - **饥饿**:线程长时间无法获取资源,...

    通过多线程解决生产者,消费者问题.pdf

    3. wait()和notify()方法:这两个方法用于线程之间的协作。当线程执行到wait()方法时,它会释放锁,并进入等待状态,直到其他线程调用同一个对象的notify()方法,该线程才有可能被唤醒,继续执行。文档中使用了wait...

    2021-2022计算机二级等级考试试题及答案No.19220.docx

    可以在构造方法中使用`this`调用其他构造方法,且调用必须放在构造方法的第一行,不能在类的两个构造方法中相互调用,选项ABC正确。D选项也是正确的,因为构造方法之间不能互相调用。 4. 命令窗口操作:在命令窗口...

    JAVA面试宝典

    11. "=="是比较两个对象的引用是否指向同一个对象,而equals方法是比较两个对象的内容是否相等。 12. 静态变量属于类,实例变量属于对象。静态变量由类加载时初始化,实例变量在对象创建时初始化。 13. static方法...

    攻克多线程时碰到的难题

    - **死锁**:两个或多个线程相互等待对方释放资源,从而导致它们都无法继续执行的情况。 - **活锁**:与死锁类似,不同之处在于线程没有被完全阻塞,而是不断地重试获取资源,但又无法成功,导致系统资源浪费严重。...

    对参数 对象的理解方法

    - **静态方法**:静态方法是类级别的方法,可以通过类名直接调用,不需要创建对象实例。静态方法中不能直接访问非静态成员变量和方法。 - **非静态方法**:非静态方法属于对象级别的方法,需要通过对象实例来调用。 ...

Global site tag (gtag.js) - Google Analytics