1.锁对象
用ReentrantLock(可重入锁)类可以声明一个锁对象,一般情况下它和synchronized(锁对象){}的用法相似,但它有更多高级功能,暂时不做讨论,使用方式如下:
ReentrantLock lock = new ReentrantLock();
lock.lock();
try
{
...
}
finally
{
lock.unlock();
}
2.条件对象
管理那些已经获得了锁对象但不能做有用工作的线程。在不满足条件时,条件对象可以调用await()方法,释放锁对象,然后让线程进入阻塞队列;当线程做了某个工作后可能使条件满足时,条件对象应该调用signal()或signalAll()方法(前者是随机唤醒一个)来唤醒阻塞队列中的线程,通知它们可以进行下一轮锁对象的争用了。使用方式如下:
Condition myCondition;
myCondition = myLock.newCondition();
myLock.lock();
try
{
while (条件不满足)
{
myCondition.await();
}
myCondition.signalAll();
}
finally
{
myLock.unlock();
}
3.synchronized关键字
(1)可以用synchronized关键字修饰一个普通方法,那么这个方法要争用的锁就是对象锁,即JVM给每个Java对象默认加上的锁。要注意一个类可能有多个对象,同时就会有多个对象锁,它们之间并不会产生竞争。所以如果是每个线程都实例化了一个新对象,这种同步方法是不起作用的。只有所有线程用的都是同一个实例对象时,即单例模式时,这种同步方法才起作用。
(2)可以用synchronized关键字修饰一个静态方法,那么这个方法要争用的锁就是类锁,即JVM给每个Java类默认加上的锁。即使在多例模式下,即每个线程都实例化了一个新对象,它们也仍然要争用同一个类锁,此同步方法仍然有效。
(3)可以用synchronized代码块:synchronized(lock){},该名为lock的变量便为此时线程要争用的对象锁。如果把该变量声明为静态,这样这个对象锁就成为类层面上的锁,对于多例模式仍然起作用。
本文介绍了Java并发编程的基础概念,包括如何使用ReentrantLock类声明锁对象,并对比了synchronized关键字的不同用法,还讲解了条件对象如何管理和协调线程。
3508

被折叠的 条评论
为什么被折叠?



