重进入(Reentrancy)

本文介绍了Java中重入锁的概念及应用实例,通过Widget和LoggingWidget两个类的对比展示了如何使用synchronized关键字实现方法的同步。文章还讨论了线程在请求对象锁时的行为。
1、内置锁:同步代码块(synchronized block),是重入锁。
2、当线程请求一个由其它线程持有的对象锁时,该线程会阻塞,而当线程请求由自己持有的对象锁时,如果该锁是重入锁,请求就会成功,否则阻塞。

public class Widget{
public synchronized void doSomething(){
System.out.println("this is Widget doSomething!");
}
}
public class LoggingWidget extends Widget{
public synchronized void doSomething(){
System.out.println("this is LoggingWidget doSomething!");
}
}
07-29
### 入的概念及其在编程与系统设计中的含义 在编程和系统设计中,**“入”**(Reentrancy)是指一个函数、模块或程序可以在执行过程中被中断,然后在中断点之后进入,而不会导致数据不一致或逻辑错误。这种特性通常用于多线程、异步处理、中断处理等并发环境中,以确保程序的稳定性和安全性。 入函数的设计通常要求其**不依赖于外部状态**或**不修改共享数据**,而是通过局部变量或传入参数进行操作,从而避免在并发调用时产生副作用。例如,以下是一个非入函数的示例: ```c int global_value = 0; int add_value(int x) { global_value += x; return global_value; } ``` 该函数依赖于全局变量 `global_value`,如果在多线程环境下被多个线程同时调用,会导致数据竞争和不可预测的结果。 与之相对,一个入函数通常使用局部变量或线程本地存储,如下所示: ```c int add_value(int a, int b) { int result = a + b; return result; } ``` 此函数完全依赖传入参数,不修改任何全局或静态变量,因此在并发环境下是安全的 [^1]。 在系统设计中,入机制也常用于**中断处理**和**递归调用**场景。例如,在操作系统内核中,中断服务例程必须是入的,以便在处理一个中断时能够响应另一个中断,而不破坏当前执行状态 [^2]。 此外,入特性在**异步编程模型**中也尤为要。例如在事件循环或回调机制中,一个异步函数可能在未完成之前被再次调用,此时必须确保其逻辑能够安全地处理这种进入的情况 [^3]。 ### 入的应用场景 1. **多线程编程**:确保多个线程可以安全地调用同一函数,而不会造成数据污染。 2. **信号处理**:在 Unix 系统中,某些信号处理函数必须是入的,以防止在处理信号的过程中被再次中断导致死锁。 3. **嵌入式系统**:特别是在中断服务程序中,入机制可以提升系统的响应能力和稳定性。 4. **异步 I/O 操作**:在 Node.js 或 Python 的异步框架中,回调函数或协程的设计通常需要支持入特性。 ### 实现入的常见方法 - 避免使用全局变量和静态变量。 - 使用线程局部存储(Thread Local Storage, TLS)来隔离不同线程的数据。 - 对共享资源的访问进行加锁保护,确保临界区的原子性。 - 在递归调用中使用栈结构保存状态,而非全局变量。 ### 入与线程安全的区别 虽然入和线程安全都涉及并发环境下的程序稳定性,但它们的侧点不同。**线程安全**强调多个线程访问共享资源时的一致性,而**入**则强调函数能否在执行过程中被中断并再次调用而不破坏状态。一个函数可以是线程安全但非入的,例如使用全局锁的函数;也可以是入但非线程安全的,例如不使用锁的共享资源访问函数 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值