线程回顾 2
来源:互联网 发布:nba2k for mac 编辑:程序博客网 时间:2024/05/16 14:12
7.Synchronization
多线程很重要的一个问题就是同步的问题,如果不解决好同步的问题一个是可能会引起数据的混乱,而且还有可能造成线程的死锁。在Java 5.0之前,用synchronized来解决这个问题,在5.0中加入了一个新的类:ReentrantLock
使用lock的基本形式是:
myLock.lock(); // a ReentrantLock object
try
{
critical section
}
finally
{
myLock.unlock(); // make sure the lock is unlocked even if an exception is thrown
}
这个锁被称为Reentrant的原因是在一个线程中可以重复多次申请同一个锁,系统会保留加锁的次数,而在解锁的时候也就必须执行相同次数。
在一个线程已经得到锁可以执行程序的时候,可能会发现需要的条件还不能满足,这时他就必须等待直到条件满足。但是因为它已经对所需要操作的东西加了锁,其他的线程不能访问,因此它又可能会永远等待下去。现在可以用Condition Object来避免这种情况。
sufficientFunds = bankLock.newCondition();
如果条件不满足:
sufficientFunds.await();
这时线程就会释放锁并进入blocked状态,其他线程就有机会执行操作。当其他线程执行完后,就可通知等待的线程继续执行它的操作了:
sufficientFunds.signalAll();
当然也可以调用singal方法,这样效率会高一些,但是有一定的危险性,因为它的唤醒具有随机性。
在5.0之前,采用的是synchronized关键字来进行同步,但是和lock相比它有一些局限性:
1. 申请锁的线程不能被interrupt
2. 没有timeout设置
3. 只有一个隐性的condition条件
另外,在申请锁的时候可以用tryLock方法,它会返回一个bool值来表示锁是否申请成功,如果没有成功,程序就可以做其他的事情了。
tryLock, await方法都可以被interrupt。
java.util.concurrent.locks包中提供了两种锁,一个就是ReentrantLock,另一个是ReentrantReadWriteLock,一般用于多操作远远多于写操作的时候:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
- 线程回顾 2
- 线程回顾
- Java多线程回顾2:线程的生命周期
- 线程回顾 1
- 线程回顾 3
- 线程回顾 4
- 进程和线程 回顾
- 传统线程技术回顾
- 传统线程技术回顾
- 线程知识回顾
- Java线程回顾
- Java基础知识回顾--线程
- Java回顾之多线程
- 线程基础知识回顾
- 传统线程技术回顾
- JUC线程-传统线程回顾
- 心得2--线程回顾之加深版--同步锁详解
- Java 回顾笔记_多线程_线程通讯2
- 对ADO。NET几个对象的第一次加工。
- WEB页常用技巧
- rfc1065
- rfc1066
- Application程序jar打包笔记
- 线程回顾 2
- 关于VB异步下载程序在下载影片时遇到的问题
- 2005.8.29 一
- 设计模式的学习笔记!(一)
- C#中类只实例化一次
- 生成器模式(Builder)
- ORACLE数据库PROC编程经验介绍(转载)
- 简单的文件操作
- 数据库设计中的反规范