lock和synchronized的区别

lock和synchronized的区别

这个问题可以从三个方面来回答:

第一个,从功能角度来看,lock和synchronized都是Java中去用来解决线程安全问题的一个工具

第二个,从特性来看,首先synchronized是Java中的同步关键字,而lock呢,是juc包里面提供的一个接口,而这个接口它有很多的实现类,其中就包括reentrantlock这样一个重入锁的实现。其次synchronized可以通过两种方式去控制锁的粒度,一种是把synchronized关键字修饰在方法层面,另一种是修饰在代码块上。并且我们可以通过synchronized加锁对象的生命周期来控制锁的作用范围。比如锁对象是静态对象或者是类对象,那么这个锁就是属于全局锁。如果锁对象是普通实例对象,那么这个锁的范围取决于这个实例的生命周期。lock中锁的粒度是通过它里面提供的lock方法和unlock方法来决定的,在两个方法之间的代码是能够保证线程安全的,而锁的作用域取决于lock实例的生命周期。然后lock比synchronized的灵活性更高,lock可以自主的去决定什么时候加锁,什么时候释放锁,只需要调用lock和unlock这两个方法就可以了。同时lock还提供了非阻塞竞争锁的方法,叫try-lock,这个方法可以通过返回true/false来告诉当前线程是否已经有其他线程正在使用锁,而synchronized由于是关键字,所以它无法去实现非阻塞竞争锁的方法。另外synchronized锁的释放是被动的,就是当synchronized同步代码块执行结束以后或者代码出现异常的时候才会被释放。最后lock提供了公平锁和非公平锁的机制,公平锁是指线程竞争锁资源的时候,如果已经有其他线程正在排队或者等待锁释放,那么当前竞争锁的线程是无法去插队的。而非公平锁就是不管是否有线程在排队等待锁,它都会去尝试去竞争一次锁。synchronized只提供了一种非公平锁的实现.

第三个,从性能方面来看,synchronized和lock在性能方面相差不大,在实现上会有一定的区别,synchronized引入了偏向锁、轻量级锁、重量级锁以及锁升级的机制来去实现锁的优化,而lock中则用到了自旋锁的方式去实现性能优化。(完)

ps: 如果有任何疑问,欢迎评论区给我留言


已有 0 条评论

    感谢参与互动!