synchronized与ReentrantLock的区别

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

内容简介:这是一个老生常谈的问题,但是如果仅仅是那些比较普遍的说法,我也不用记录这篇文章,今天在写两者代码的时候还有一个不容易发现到的区别点。还有一个区别是使用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的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

第一本Docker书 修订版

第一本Docker书 修订版

詹姆斯·特恩布尔 (James Turnbull) / 李兆海、刘斌、巨震 / 人民邮电出版社 / 2016-4-1 / CNY 59.00

Docker是一个开源的应用容器引擎,开发者可以利用Docker打包自己的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 本书由Docker公司前服务与支持副总裁James Turnbull编写,是Docker开发指南。本书专注于Docker 1.9及以上版本,指导读者完成Docker的安装、部署、管理和扩展,带领读者经历从测试到生产的整个开发生......一起来看看 《第一本Docker书 修订版》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

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

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具