synchronized与ReentrantLock的区别

栏目: Java · 发布时间: 7年前

内容简介:这是一个老生常谈的问题,但是如果仅仅是那些比较普遍的说法,我也不用记录这篇文章,今天在写两者代码的时候还有一个不容易发现到的区别点。还有一个区别是使用synchronized的线程会被block住,而ReentrantLock的线程则是进入waiting状态ReentrantLock真的比synchronized性能高吗?

这是一个老生常谈的问题,但是如果仅仅是那些比较普遍的说法,我也不用记录这篇文章,今天在写两者代码的时候还有一个不容易发现到的区别点。

常规区别

  • ReentrantLock更加灵活,提供了超时获取锁,可中断锁。提供了非公平锁和非公平锁,而synchronized仅仅是非公平锁。
  • 用法上,ReentrantLock必须手动释放锁,并且只能修饰代码块。而synchronized不用手动释放锁,除此之外可以修饰方法。

还有一个区别是使用synchronized的线程会被block住,而ReentrantLock的线程则是进入waiting状态

疑问点

ReentrantLock真的比synchronized性能高吗?

我写了一个简单的demo

public class LockDemo {

    static ReentrantLock lock = new ReentrantLock(false);

    public static void main(String[] args) {
        syncTest();
		 //分别测试
//        lockTest();
    }


    public static void syncTest() {
        for (int i = 0; i < 10; i++) {
            new Thread() {
                @Override
                public void run() {
                    synchronized (lock) {
                        System.out.println(Thread.currentThread().getName() + "开始锁定");
                        try {
                            Thread.sleep(2 * 1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            System.out.println(Thread.currentThread().getName() + "解锁");

                        }
                    }
                }
            }.start();
        }
    }

    public static void lockTest() {
        for (int i = 0; i < 10; i++) {
            new Thread() {
                @Override
                public void run() {
                    lock.lock();
                    System.out.println(Thread.currentThread().getName() + "开始锁定");
                    try {
                        Thread.sleep(2 * 1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        System.out.println(Thread.currentThread().getName() + "解锁");
                        lock.unlock();
                    }
                }
            }.start();
        }
    }

}

复制代码

运行的结果如下:

Synchonized,其线程状态只有time_waiting与blocked,当获取到锁的线程执行完毕之后,其余线程会一起再次争抢锁

synchronized与ReentrantLock的区别
synchronized与ReentrantLock的区别

ReentrantLock的非公平锁测试,尽管我用的是非公平锁,但是看起来还是有公平性的。其内部线程进入的是waiting状态

synchronized与ReentrantLock的区别
synchronized与ReentrantLock的区别

至于是否性能是高点,我觉得单个线程去获取锁会比多个线程一起去抢锁性能会高一些吧,synchronized对锁做的优化也只是在单线程以及两个线程的时候做的优化,一旦升级为重量级锁,那些优化也就没有效果了。

当然这是个人猜测。


以上所述就是小编给大家介绍的《synchronized与ReentrantLock的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTTP Essentials

HTTP Essentials

Stephen A. Thomas、Stephen Thomas / Wiley / 2001-03-08 / USD 34.99

The first complete reference guide to the essential Web protocol As applications and services converge and Web technologies not only assume HTTP but require developers to manipulate it, it is be......一起来看看 《HTTP Essentials》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具