synchronized和lock区别有哪些?要如何实现?

TheDisguiser 2020-06-05 11:15:34 java常见问答 7579

Synchronized关键字小伙伴们应该都知道吧,加锁都需要靠这个家伙,那小伙伴们知道synchronized和lock有哪些区别吗?下面快跟小编来了解了解吧。

一、底层工作机制

synchronized

Java中,synchronized关键字是属于JVM层面实现的,它的底层是通过monitor对象来完成的,其实wait/notify等方法也依赖monitor对象只有在同步代码块和同步方法中才能调用wait/notify等方法。

lock

Lock与synchronized不同,它是一个具体的类,它是java api层面的锁。

二、使用方式详解

synchronized

Synchronized关键字运行后是不需要用户去手动释放锁的,在synchronized代码执行成功后系统会自动让线程释放对锁的占据。

lock

ReentrantLock锁运行后需要用户手动去释放锁,如若用户没有主动去释放锁,就有可能导致出现死锁现象。ReentrantLock需要使用lock()和unlock()方法配合try finally语句块来完成。

三、在程序运行中等待能否中断

synchronized

synchronized不能中断,除非抛出异常或者正常运行完成。

ReetrantLock

ReetrantLock可中断,无影响。

中断方法

1)、设置超时方法tryLock(long timeout, TimeUnit unit)。

2)、把lockInterruptibly()放入代码块中,调用interrupt()方法即可。

四、它们的加锁是否公平

synchronized

否。synchronized是非公平锁。

ReentrantLock

ReentrantLock默认为非公平锁,然可设置为公平锁。

五、它们的锁是否能绑定多个条件condition

synchronized

否,synchronized不能

ReentrantLock

如果使用ReentrantLock来实现分组唤醒需要唤醒的线程们,就可以精确唤醒,不会如synchronized样,要么随机唤醒一个,要么唤醒全部线程。

六、代码示例

例:使用多线程,在它们之间按找顺序调用,实现A->B->C三个线程启动,要求如下:

AA打印5次,BB打印10次,CC打印15次,重复上述过程10次。

class ShareResource
{
    private int number = 1; // A:1, B:2, C:3
    private Lock lock = new ReentrantLock();
    private Condition conditionA = lock.newCondition();
    private Condition conditionB = lock.newCondition();
    private Condition conditionC = lock.newCondition();
    public void print5()
    {
        try
        {
            lock.lock();
            while (number != 1)
            {
                conditionA.await();
            }
            for (int i = 1; i <= 5; i++)
            {
                System.out.print("A");
            }
            System.out.println();
            number++;
            conditionB.signal();
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        finally
        {
            lock.unlock();
        }
    }
    public void print10()
    {
        try
        {
            lock.lock();
            while (number != 2)
            {
                conditionB.await();
            }
            for (int i = 1; i <= 10; i++)
            {
                System.out.print("B");
            }
            System.out.println();
            number++;
            conditionC.signal();
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        finally
        {
            lock.unlock();
        }
    }
    public void print15()
    {
        try
        {
            lock.lock();
            while (number != 3)
            {
                conditionC.await();
            }
            for (int i = 1; i <= 15; i++)
            {
                System.out.print("C");
            }
            System.out.println();
            number = 1;
            conditionA.signal();
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        finally
        {
            lock.unlock();
        }
    }
}
public class SynchronizedLockDifference
{
    public static void main(String[] args)
    {
        ShareResource shareResource = new ShareResource();
        new Thread(() - >
            {
                for (int i = 1; i <= 10; i++)
                {
                    shareResource.print5();
                }
            }, "A")
            .start();
        new Thread(() - >
            {
                for (int i = 1; i <= 10; i++)
                {
                    shareResource.print10();
                }
            }, "B")
            .start();
        new Thread(() - >
            {
                for (int i = 1; i <= 10; i++)
                {
                    shareResource.print15();
                }
            }, "C")
            .start();
    }
}

以上就是关于synchronized和lock区别的全部内容了,小伙伴们如果还想了解更多java关键字相关java架构师知识的话,就请一直关注我们的网站吧。

推荐阅读:

Synchronized和Reentrantlock区别是什么?简单叙述

sychronized和reentrantlock区别在哪里?都有什么用处?

synchronized和reentrantlock区别有哪些?区别一览