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多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...
java同步synchronized关键字用法示例
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
主要介绍了Java中使用synchronized关键字实现简单同步操作示例,本文起讲解了synchronized修饰函数、synchronized修饰代码块、synchronized修饰静态方法等内容,需要的朋友可以参考下
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock。 Synchronized 和 Lock的概念 Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized...
java中synchronized的使用,java中的锁锁的到底是什么?是括号里的代码块吗?肯定不是的;
主要介绍了Java使用synchronized实现互斥锁功能,结合实例形式分析了Java使用synchronized互斥锁功能简单实现方法与操作技巧,需要的朋友可以参考下
[JAVA][synchronized的使用]
基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
java中synchronized用法
使用synchronized实现多线程同步.pdf
Synchronized锁在Spring事务管理下,导致线程不安全。
在 Java 5 以前,synchronized 是仅有的同步手段,在代码中, synchronized 可以用来修饰方法,也可以使用在特定的代码块儿上,本质上
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
你还在用synchronized?线程安全相关知识深入剖析
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
线程安全,使用synchronized关键字