Java多线程:循环打印与死锁示例

需积分: 0 0 下载量 48 浏览量 更新于2024-07-01 收藏 3.15MB PDF 举报
"剑指Offer1, 死锁Demo" 这里有两个相关的编程问题,分别是多线程循环打印数字和线程死锁的示例。 首先,我们来看第一个问题,"三个线程循环打印数字"。这个问题涉及到Java中的多线程同步控制。在给出的代码中,创建了三个线程t1、t2、t3,它们分别代表三个线程。每个线程都是一个实现了Runnable接口的`MyThread1`实例。线程内部的关键在于对共享变量`count`和`lock`对象的同步操作。 `synchronized(lock)`关键字确保了在同一时间只有一个线程能够执行同步块内的代码,防止了多个线程同时访问临界区,避免数据竞争。在循环中,线程检查`count`是否超过100,如果是,则跳出循环;否则,根据`count`对3取余的结果来决定哪个线程进行打印。当当前线程的编号与`count`对3取余相等时,打印当前线程编号和`count`值,并增加`count`。如果条件不满足,线程调用`lock.wait()`释放锁并进入等待状态,等待其他线程唤醒。通过`lock.notifyAll()`,当前线程唤醒所有等待在该锁上的线程,使得其他线程有机会继续执行。 接下来是第二个问题,"线程死锁"的示例。死锁是指两个或更多个线程互相等待对方释放资源而造成的僵局。在`Lock`类的示例中,展示了如何引发死锁。创建了两个对象`resource1`和`resource2`作为两个资源,然后在一个线程中先获取`resource1`,再试图获取`resource2`,而在另一个线程中则顺序相反。由于线程A持有`resource1`并等待`resource2`,线程B持有`resource2`并等待`resource1`,这就导致了两个线程都无法继续执行,形成了死锁。 避免死锁的方法包括: 1. 避免嵌套锁:尽量减少一个线程获取多个锁的情况。 2. 锁顺序:如果必须使用多个锁,可以规定一个全局的锁获取顺序,并确保所有线程都遵循这个顺序。 3. 死锁检测:系统定期检测是否存在死锁,并在检测到时采取恢复措施。 4. 超时和重试:设置锁的持有时间限制,超时后释放锁并重新尝试获取。 5. 避免无限期等待:使用`wait()`时,最好指定一个超时时间,防止线程无限制地等待。 理解这些概念对于解决多线程并发问题和优化程序性能至关重要。在实际开发中,要特别注意线程安全和并发控制,避免出现数据不一致或系统挂起等问题。