线程同步

本文介绍了Java并发编程的基础概念,包括如何使用ReentrantLock类声明锁对象,并对比了synchronized关键字的不同用法,还讲解了条件对象如何管理和协调线程。

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的变量便为此时线程要争用的对象锁。如果把该变量声明为静态,这样这个对象锁就成为类层面上的锁,对于多例模式仍然起作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值