ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。当需要一些高级功能时才使用ReentrantLock,包括定时的锁等待,可中断的锁等待,公平性,锁绑定多个条件以及实现非块结构的加锁。否则,还是应该优先使用内置锁synchronized。synchronized是JVM的内置特性,可以进行一些优化。比如对线程封闭锁对象的锁消除优化,通过增加锁粒度来消除内置锁的同步等。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class MultiThreadPrint
{
public static void main(String[] args)
{
init();
}
private static void init()
{
ExecutorService executor = Executors.newFixedThreadPool(3);
final Print print = new SynchronizedPrint();
// final Print print = new ConditionPrint();
executor.execute(new Runnable()
{
@Override
public void run()
{
try
{
Thread.currentThread().setName("thread A");
print.printA();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
});
executor.execute(new Runnable()
{
@Override
public void run()
{
try
{
Thread.currentThread().setName("thread B");
print.printB();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
});
executor.execute(new Runnable()
{
@Override
public void run()
{
try
{
Thread.currentThread().setName("thread C");
print.printC();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
});
try
{
Thread.sleep(20*1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
executor.shutdownNow();
}
interface Print
{
void printA() throws InterruptedException;
void printB() throws InterruptedException;
void printC() throws InterruptedException;
}
static class SynchronizedPrint implements Print
{
int flag = 1;
@Override
public void printA() throws InterruptedException
{
while (true)
{
synchronized (this)
{
while (flag != 1)
{
this.wait();
}
System.out.println(Thread.currentThread().getName() + " prints " + "A");
Thread.sleep(800);
flag = 2;
notifyAll();
}
}
}
@Override
public void printB() throws InterruptedException
{
while (true)
{
synchronized (this)
{
while (flag != 2)
{
this.wait();
}
System.out.println(Thread.currentThread().getName() + " prints " + "B");
Thread.sleep(800);
flag = 3;
notifyAll();
}
}
}
@Override
public void printC() throws InterruptedException
{
while (true)
{
synchronized (this)
{
while (flag != 3)
{
this.wait();
}
System.out.println(Thread.currentThread().getName() + " prints " + "C");
Thread.sleep(800);
flag = 1;
notifyAll();
}
}
}
}
static class ConditionPrint implements Print
{
final ReentrantLock lock = new ReentrantLock();
final Condition cond1 = lock.newCondition();
final Condition cond2 = lock.newCondition();
final Condition cond3 = lock.newCondition();
int flag = 1;
public void printA() throws InterruptedException
{
while (true)
{
lock.lock();
try
{
while (flag != 1)
{
cond1.await();
}
System.out.println(Thread.currentThread().getName() + " prints " + "A");
Thread.sleep(800);
flag = 2;
cond2.signal();
}
finally
{
lock.unlock();
}
}
}
public void printC() throws InterruptedException
{
while (true)
{
lock.lock();
try
{
while (flag != 2)
{
cond2.await();
}
System.out.println(Thread.currentThread().getName() + " prints " + "B");
Thread.sleep(800);
flag = 3;
cond3.signal();
}
finally
{
lock.unlock();
}
}
}
public void printB() throws InterruptedException
{
while (true)
{
lock.lock();
try
{
while (flag != 3)
{
cond3.await();
}
System.out.println(Thread.currentThread().getName() + " prints " + "C");
Thread.sleep(800);
flag = 1;
cond1.signal();
}
finally
{
lock.unlock();
}
}
}
}
}
控制台输出:
thread A prints A
thread B prints B
thread C prints C
thread A prints A
thread B prints B
thread C prints C
thread A prints A
thread B prints B
thread C prints C
。。。。
分享到:
相关推荐
在Java课程设计中,"三线程接力"是一个典型的多线程编程问题,它涉及到并发控制、线程间协作以及时间间隔的精确控制。在这个项目中,我们有三个颜色的按钮——红色、蓝色和绿色,它们分别在特定的时间间隔内进行操作...
标题提到的"三线程分别显示各自时间"是一个典型的多线程示例,它涉及到如何创建和控制多个线程来按照特定的时间间隔执行任务。下面将详细介绍如何实现这个功能。 首先,我们需要了解Java中的线程基础。在Java中,...
java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
在本文中,我们将深入探讨如何使用Java编程语言实现一个三线程系统,该系统能够随机地在界面上显示26个英文字母。这个任务的关键在于理解和应用多线程概念,以及如何同步线程以避免数据竞争和死锁。首先,我们需要...
- **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...
本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法加锁。 1. **方法加锁** 当在实例方法前使用`synchronized`关键字时,它会锁定当前对象的监视器,只有...
- **解释**:线程`A`和线程`B`共享同一个`Thread1`实例`t1`,因此当线程`A`获取到`t1`的锁并执行`synchronized(this)`内的代码时,线程`B`将被阻塞,直到线程`A`释放锁。 2. **同步代码块与非同步代码块的访问** ...
在这个场景中,我们关注的是一个特定的多线程问题:A线程需要等待B线程和C线程执行完毕后再开始执行,同时避免A线程无休止地检查状态导致的CPU空耗。 首先,我们需要理解Java中线程间的协作机制。Java提供了多种...
本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...
主线程通常负责用户界面的更新和事件处理,而子线程则用于执行耗时的任务,以避免阻塞UI。本示例将深入探讨如何在Java或C#等支持多线程的编程语言中,安全地从子线程操作主线程。 首先,我们需要理解线程同步的概念...
Java中的`synchronized`关键字是用于实现线程同步的关键工具,其目的是确保在多线程环境中,同一时刻只有一个线程能够执行特定的代码块或方法,从而避免数据竞争和并发问题。下面将详细介绍`synchronized`关键字的三...
可以看到,线程A先执行了`synchronized`代码块中的所有循环,然后线程B才开始执行,这证明了`synchronized`能够保证同一时间只有一个线程执行。 ##### 示例2:同步代码块 在第二个例子中,我们定义了一个`Thread2`...
Java使用synchronized实现互斥锁功能示例 在Java编程语言中,synchronized关键字是实现互斥锁功能的主要手段。互斥锁是一种机制,用于控制多个线程访问共享资源的顺序,从而避免因为资源竞争而导致的程序错误。在...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...
当两个线程`A`和`B`分别启动时,它们都将尝试执行该同步代码块。根据`synchronized`的特性,一次只有一个线程能够执行同步代码块。因此,我们可以观察到输出结果中线程`A`先执行完所有的循环之后,线程`B`才开始执行...
总结,`synchronized`是Java中实现线程安全的关键工具,理解其工作原理和使用方式对于编写高效、安全的多线程程序至关重要。然而,在实际应用中,我们需要根据具体场景选择最合适的并发控制手段,平衡性能和安全性。
四、synchronized 关键字的使用示例 以下是一个简单的示例代码,演示了 synchronized 关键字的使用: ```java public class TxtThread implements Runnable { int num = 100; String str = new String(); ...
Java synchronized 详解 Java 中的同步机制是多线程编程中最重要的概念之一。它允许开发者控制多个...通过使用 synchronized,可以确保在同一时间只有一个线程可以访问共享资源,以防止数据不一致和 race condition。
在Java中,为了保证多线程环境下数据的一致性和安全性,可以采用两种主要的方法:`synchronized`和`volatile`。 ##### 1. synchronized关键字 `synchronized`是一种基于锁的同步机制,它可以应用于方法或者代码块...
这些房间可以被分为两种:上锁房间(synchronized 方法)和不上锁房间(普通方法)。每个对象都有一个钥匙(key),该钥匙可以打开所有上锁的房间。 Synchronized 方法 当一个线程想要进入一个上锁房间时,它需要...