区别
sychronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由jvm实现,用户不需要显示的释放锁,非常方便,然而synchronized也由一定的局限性,例如:
1、当线程尝试获取锁的时候,如果获取不到锁会一直阻塞,这个阻塞的过程,用户无法控制
2、如果获取锁的进程进入休眠状态或者阻塞,除非当前线程异常,否则其他线程尝试获取锁必须一直等待
JDK1.5之后发布,加入了Doug Lea 实现的java.util.concurrent包,包内提供Lock类,用来提供更多的扩展的加锁功能。Lock弥补了synchronize的局限,提供了更加细粒度的加锁功能。
synchronize的用法
直接在需要的方法中加入关键字synchronize
Lock
class ShareResource {
private int falg = 1;//1:A 2:B 3:C
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void aa() throws Exception {
//开启锁
lock.lock();
try {
while (falg!=1){
//线程等待
condition.await();
}
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"come--------------"+i);
}
falg=2;
//通知其他线程
condition.signalAll();
} finally {
//解锁
lock.unlock();
}
}
Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); lock.lock(); try{ //业务逻辑 } finally { lock.unlock(); }