《java并发编程实践》一书中,关于synchronized内置锁的可重入的例子如下:
------------------------------------------------------------------------------------------------------
public class Widget {
public synchronized void doSomething() {
...
}
}
public class LoggingWidget extends Widget {
public synchronized void doSomething() {
System.out.println(toString() + ": calling doSomething");
super.doSomething();//若内置锁是不可重入的,则发生死锁
}
}
-------------------------------------------------------------------------------------------------------
小弟在此次有两点疑惑:
1、LoggingWidget 的对象调用doSomething方法时,锁对象为LoggingWidget对象
super.doSomething()调用是锁对象是谁?LoggingWidget对象 还是 Widget 的Class对象?
运行程序,查看thread dump发现:调用super.doSomething()时锁对象依然是LoggingWidget对象。
"线程#1" prio=6 tid=0x0bd60400 nid=0x16f8 waiting on condition [0x0bf8f000..0x0bf8fd68]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at Widget.doSomething(Widget.java:4)
- locked <0x03fbc150> (a LoggingWidget)
at LoggingWidget.doSomething(LoggingWidget.java:5)
- locked <0x03fbc150> (a LoggingWidget)
at LoggingWidget$1.run(LoggingWidget.java:15)
Locked ownable synchronizers:
- None
2、在网上搜索发现,大伙都如是说:
请大家讨论一下,在子类调用父类方法时,是否同时获取父类的锁(父类的class对象?)
分享到:
相关推荐
- **ReentrantLock**:是Java并发包`java.util.concurrent.locks`中的可重入锁,提供了比`synchronized`更细粒度的控制,支持公平锁和非公平锁,以及可中断和可定时的获取锁。 7. **TestSynchronized 示例** 通常...
Java 中的 Lock 和 Synchronized 的区别 Java 语言中有很多相似关键字或相似意义的字,...lock 提供了更加灵活和高效的锁机制,可以满足不同场景下的需求,而 synchronized 则是 Java 中的关键字,具有语言的内置性。
深入理解Java内置锁(synchronized)和显式锁(ReentrantLock) Java中有两种锁机制:内置锁(synchronized)和显式锁(ReentrantLock)。内置锁是Java语言提供的一种同步机制,使用synchronized关键字声明的方法或...
2. ReentrantLock(可重入锁):实现了Lock接口,是Java中唯一可重入的互斥锁,与内置锁有类似的语义,但功能更强大。 ```java import java.util.concurrent.locks.Lock; import java.util.concurrent.locks....
在Java多线程高并发编程中,重入锁(ReentrantLock)是一个至关重要的概念,它提供了比Java内置锁(synchronized)更细粒度的控制,并且具有更高的可读性和可扩展性。本篇文章将深入探讨重入锁的相关知识点。 首先...
Java作为一种广泛使用的编程语言,其提供了内置的同步机制来实现锁的功能,其中"Synchronized"关键字是最为常用的方式之一。在Java高并发编程领域,理解Synchronized锁的升级机制是非常重要的。 首先需要知道的是,...
- 示例2则演示了即使一个线程在一个`synchronized(this)`块中,其他线程仍可访问同一对象上的非`synchronized(this)`代码块,因为这些代码块没有受到当前对象锁的保护。 5. **锁的粒度**: - `synchronized`...
每个Java对象都可以作为锁,`synchronized`关键字实际上是在获取和释放对象的监视器锁(也称为内置锁或互斥锁)。对于非静态方法,锁是当前对象;对于静态方法,锁是对应的类的Class对象。 三、synchronized的两种...
Java允许在一个`synchronized`代码块内再嵌套另一个`synchronized`代码块,即使它们使用相同的锁对象。这种情况下,锁会被多次获取,相应的,也需要多次释放才能完全释放锁。嵌套锁通常用于更复杂的线程间协调逻辑,...
相比之下,ReentrantLock(可重入锁)是Java并发包java.util.concurrent.locks中的一个类,提供了更细粒度的锁控制。ReentrantLock允许显式获取和释放锁,并且支持更丰富的锁原语,如公平锁、非公平锁、可中断锁、...
Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁(Explicit Locks),提供了一系列比内置锁(synchronized)更灵活的同步手段。 在Java中,内置锁是通过synchronized关键字实现的,而显示锁则是...
Java 中的同步机制主要用于解决多线程环境下的数据安全问题,其中synchronized关键字是Java提供的一种内置锁,也称为监视器锁或悲观锁。synchronized可以确保在同一时刻,只有一个线程能执行特定的代码块,从而保证...
无论是内置的 `synchronized` 还是 `java.util.concurrent.locks.ReentrantLock`,都通过可重入性确保了在复杂多线程环境下的正确性和可靠性。在实际编程中,理解并熟练掌握可重入锁的原理和使用方法,对优化并发...
2. **可重入性**:synchronized也支持可重入,即一个线程已经获得了锁,可以再次进入持有该锁的代码块,这对于递归调用是必要的。 3. **内存可见性**:synchronized能确保线程之间的内存可见性,即当一个线程修改了...
在Java多线程编程中,锁机制是保证线程安全和数据一致性的重要工具。本篇文章将深入探讨Java锁的释放与建立,以及它们之间的_happens-before_关系,旨在帮助开发者更好地理解和应用并发控制。 首先,Java中的锁主要...
5. **锁的种类**:除了Synchronized,Java还有其他类型的锁,如ReentrantLock(可重入锁,功能与Synchronized类似但更灵活)、Semaphore(信号量,控制同时访问特定资源的线程数量)和ReadWriteLock(读写锁,允许多...
`synchronized`关键字是Java中的内置锁机制,它基于Java内存模型(JMM)来确保线程间的可见性和有序性。当一个线程持有对象的锁时,其他线程试图访问该对象的同步代码会阻塞,直到锁被释放。 4. **Java锁的类型**...
内置锁是Java中通过`synchronized`关键字实现的。当一个线程进入`synchronized`修饰的方法或代码块时,它会自动获取锁,离开时自动释放。这种锁的获取和释放过程对程序员来说是透明的,因此被称为隐式操作。使用内置...
Java的`ReentrantLock`和`synchronized`都是可重入锁。 - **不可重入锁** 如果线程已经在持有锁的情况下尝试再次获取,会导致死锁。例如,上述代码中的自旋锁模拟展示了不可重入锁的实现。 3. **独享锁 / 共享锁**...