多线程锁主要有synchronized和lock
区别:
- synchronized粒度大,释放锁只有两种情况,1,被锁住的代码执行完毕,2抛异常JVM会主动开锁。
- lock粒度小,开锁和解锁都必须由我们自己的代码实现
lock是接口,常用实现类有ReentrantLock、ReentrantReadWriteLock
实现ReentrantLock
lock()—获取锁
unlock()—释放锁
tryLock()—获取锁有返回值,立即返回
tryLock(1000,TimeUtil.xxxx)----获取锁,没获取到就等待1000毫秒,之间只要获取到了返回true,到时间了还没获取到返回false
实现ReentrantReadWriteLock
readLock().lock()—获取读锁
readLock().unlock()—释放读锁
writeLock().locl()—获取写锁
writeLock().unlock()—释放写锁
举例
package day01.thread;
import java.util.concurrent.Callable;
import java.util.concurrent.locks.Lock;
public class TaskCallable implements Callable<String> {
private Lock lock;
public TaskCallable(Lock lock) {
super();
this.lock = lock;
}
public Lock getLock() {
return lock;
}
public void setLock(Lock lock) {
this.lock = lock;
}
@Override
public String call() throws Exception {
lock.lock();
//被lock锁住的东西要放到try里面,解锁要放finally里面保证一定会释放锁
try {
System.out.println("我要睡眠2秒");
Thread.sleep(2000);
System.out.println("我睡完了");
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
return "success";
}
}