Java中synchronized和ReentrantLock使用

java中的锁是为了保证多线程操作同一个资源的时候 不会因为多线程的不安全性导致结果不一致

只能用于同一个jvm中的应用加锁

锁操作的对象只能是同一个jvm下的所有多线程的操作 不适合分布式系统和集群操作

使用synchronized的时候 区分 类锁 和 对象锁
// 对象锁
public synchronized void test(){
}
...
// 类锁
public static synchronized void test(){
}
...
// 对象锁
public void test(){
	synchronized(this){
	}
}
...
// 类锁 直接使用xxx.class 等同于类锁 xxx.class为一个Clazz类型的变量
public void test(){
	synchronized(xxx.class){
	}
}

使用synchronized的时候 同一个对象可以阻塞使用当前对象做锁的所有线程

ReentrantLock可重入锁 java.util.concurrent.locks.ReentrantLock concurrent包下的类线程安全
// 使用同一把锁进行操作 锁之后一定要记得释放锁
ReentrantLock lock = new ReentrantLock();
Object result = null;
lock.lock();
try {
    result = mDemoService.test("", "", "");
} finally {
    lock.unlock();
}

可重入锁效率会高于synchronized 但是多次测试并没有发下太明显的差距,可能测试的业务比较简单的缘故 可重入锁 使用的时候 控制粒度可以更细致些 可以手动控制锁的过程

发布了200 篇原创文章 · 获赞 97 · 访问量 59万+

猜你喜欢

转载自blog.csdn.net/u010838785/article/details/103148319