精华内容
下载资源
问答
  • lock锁和Synchronized区别: java开发中处理线程同步问题提供了两种锁,lock锁和Synchronized,下面总结下两种锁的区别: 一.lock锁和Synchronized用法的区别 synchronizedsynchronized可以加在方法上,也...

    lock锁和Synchronized的区别:

         java开发中处理线程同步问题提供了两种锁,lock锁和Synchronized,下面总结下两种锁的区别:

    一.lock锁和Synchronized用法的区别

       synchronized:synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。

      lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

    二.synchronized和lock性能区别

        1.synchronized是托管给JVM执行的,而lock是java写的控制锁的代码。在Java1.5中,synchronize是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。但是到了Java1.6,发生了变化。synchronize在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在Java1.6上synchronize的性能并不比Lock差。官方也表示,他们也更支持synchronize,在未来的版本中还有优化余地。

       简述:在java1.5中Synchronized性能比lock低,在java1.6及以上做了优化,性能不比lock差,未来官方更支持Synchronized,会继续优化。

        2.synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。而在CPU转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低。而Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作(Compare and Swap)。我们可以进一步研究ReentrantLock的源代码,会发现其中比较重要的获得锁的一个方法是compareAndSetState。这里其实就是调用的CPU提供的特殊指令。现代的CPU提供了指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。这个算法称作非阻塞算法,意思是一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。

    三.synchronized和lock用途区别

        synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候。

      1.某个线程在等待一个锁的控制权的这段时间需要中断
      2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程
      3.具有公平锁功能,每个到来的线程都将排队等候
    原文链接:https://blog.csdn.net/natian306/article/details/18504111

    展开全文
  • Java 初识Lock锁和Synchronized

    千次阅读 2020-11-25 10:41:21
    我们模拟一个卖票系统,...Lock锁和Synchronized区别 1.Synchronized 是我们java中的关键字,Lock 是一个java类 2.Synchronized 无法获取锁的状态,Lock 可以判断是否获取到锁 3.Synchronized 可以自动释放锁,Lock 需

    Lock锁和Synchronized区别

    1.Synchronized 是我们java中的关键字,Lock 是一个java类

    2.Synchronized 无法获取锁的状态,Lock 可以判断是否获取到锁

    3.Synchronized 可以自动释放锁,Lock 需要手动释放锁,如果Lock不释放的话会出现我们常见的死锁

    4.Synchronized 可重入锁,不可以中断,非公平的;Lock 可重入锁,可以判断锁,可以公平

    5.Synchronized 适合锁少量的代码同步问题;Lock 适合锁大量的代码同步


    我们模拟一个卖票系统,演示并发

    1.三个线程同时卖票,我们可以看到控制台圈红的输出信息,剩余的票是杂乱无序的

    在这里插入图片描述

    2.以前我们解决这个问题只需要加一个关键字 synchronized即可

    在这里插入图片描述


    初识Lock锁,我们同样用代码演示,主要看圈红的步骤

    在这里插入图片描述


    展开全文
  • Lock锁synchronized锁的区别 1、synchronized锁是可以帮助我们自动开锁关闭锁 2、Lock锁,我们最常用的是ReentrantLock重入锁,需要我们手动的开锁手动关锁 3、synchronized只能与wait()、notify()方法一起...

    Lock锁与synchronized锁的区别

    1、synchronized锁是可以帮助我们自动开锁和关闭锁
    2、Lock锁,我们最常用的是ReentrantLock重入锁,需要我们手动的开锁和手动关锁
    3、synchronized只能与wait()、notify()方法一起使用
    4、ReentrantLock只能与Condition类中的await()、single()方法一起使用

    用ReentranLock修改我们上篇文章的生产者和消费者模型

    、产品
    在这里插入图片描述
    、生产者

    /**
     * 生产者
     */
    class Product extends Thread {
        private int count = 1;
        private User user;
    
        public Product(User user) {
            this.user = user;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    //开锁
                    user.getLock().lock();
                    if (user.flag) {
                        try {
                            user.getCondition().await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    if (count == 1) {
                        user.setId(1);
                        user.setName("紫炎易霄");
                        user.setAge(21);
                    } else {
                        user.setId(6);
                        user.setName("黑袍萧寻");
                        user.setAge(66);
                    }
                    count = (count + 1) % 2;
                    user.flag = true;
                    //唤醒另一个线程
                    user.getCondition().signal();
                } catch (Exception e) {
                    e.getStackTrace();
                } finally {
                    //释放锁
                    user.getLock().unlock();
                }
    
            }
        }
    }
    

    、消费者

    /**
     * 消费者
     */
    class Consumer extends Thread {
        private User user;
    
        public Consumer(User user) {
            this.user = user;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    user.getLock().lock();
                    //上锁
                    if (!user.flag) {
                        try {
                            user.getCondition().await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(user);
                    user.flag = false;
                    //唤醒生产者线程
                    user.getCondition().signal();
                } catch (Exception e) {
                    e.getStackTrace();
                } finally {
                    //释放锁
                    user.getLock().unlock();
                }
            }
        }
    }
    

    、运行结果
    在这里插入图片描述

    展开全文
  • Java的Lock锁和synchronized关键字的区别及其使用 一、synchronized关键字Lock的区别以及优缺点 我们可以回顾一下synchronized的使用,synchronized释放锁的时机有以下几种:当执行完代码块中的代码,释放锁;...

    Java的Lock锁和synchronized关键字的区别及其使用

        一、synchronized关键字和Lock的区别以及优缺点

        我们可以回顾一下synchronized的使用,synchronized释放锁的时机有以下几种:
    1. 当执行完代码块中的代码,释放锁;
    2. 当代码抛出异常,释放锁;
    3. 当调用锁的wait方法,释放锁;

        以上三种情况便可以完全的帮我们解决线程同步的问题,为什么还要引入Lock呢?同样,synchronized关键字也有三种局限性:

    1. synchronized关键字无法响应中断,如果线程未获得锁,便会一直地尝试去获得锁,不会响应中断,lock锁的lockInterruptibly()方法能让线程响应中断,同时tryLock可以加入时间参数,若一定时间内未获得锁便返回,很灵活;
    2. synchronized关键字无法读写分离,在多个读线程访问临界资源时,是不需要同步的,但是synchronized关键字通通都给同步了,会导致效率很慢,Lock提供读写锁,实现读写分离;
    3. synchronized关键字无法知道线程是否获得锁;

        以上为synchronized的局限性,但是Lock也有他的缺点,Lock需要显式的释放锁,否则会造成死锁。

        接下来我们之上而下地看看Lock的类和接口吧...

        二、Lock接口

        Lock接口是最顶层的接口,提供的方法主要有这么几个:

        1、lock()

        lock()方法会尝试的获取锁,如果锁已经被其他线程给获取了,就会阻塞等待,需要注意的是,lock()需要显式地释放锁,如果发生异常也不会释放锁,所以很容易发生死锁,通常需要在finally中释放锁,保证锁一定被释放。

        2、tryLock()

        tryLock()会非阻塞地去获取锁,若获得锁则返回true,否则返回false,可以加入时间长度和时间单位参数,给线程一段等待的时间。

        3、lockInterruptibly()

        比较独特的一个用法,该方法获取锁时,若未获取到锁,等待阶段可以响应中断。在线程A和线程B竞争锁的时候,若线程B竞争失败,可以调用线程B的interrupt()方法打断线程B的阻塞状态。
        注意,interrupt()方法只能打断阻塞状态的线程,而不能打断已经获得锁的正在运行的线程。

        三、ReentrantLock类

        是唯一实现了Lock接口的类,重入锁(即,当一个线程已经获得了锁以后,当再次访问临界资源时,可以直接获得锁,synchronized关键字便是重入锁)。

        四、ReentrantReadWriteLock类

        ReentrantReadWriteLock类实现了ReadWriteLock接口,不过该接口只有两个方法,一个是获得读锁,一个是获得写锁。
        关于读写的冲突问题,掌握此三句:读读不冲突,读写冲突,写写冲突。

        五、Condition类

        Condition类提供wait()和notify()方法的替代,由锁实现,await()方法替代wait()方法,signal()和signalAll()方法替代notify()和notifyAll()方法,不同的是,一个Lock可以有多个Condition,而一个synchronized关键字只能有一个阻塞队列。

        如,在生产者消费者模型中,可以有两个Condition,一个用于提示仓库已满,一个用于提示仓库已空。

        以上便是Lock的全部内容,接下来介绍几种锁的概念:

        六、锁的概念

        1、重入锁

        上文已经提及,不赘述。

        2、可中断锁

        顾名思义,是可以响应中断的锁,synchronized关键字是非可中断锁,Lock是可中断锁。

        3、公平锁

        公平锁的含义就是,当多个线程等待同一个锁的时候,等待时间最久的线程获得即将释放的锁,即为公平,synchronized关键字是非公平的,Lock默认情况也是非公平的,但是可以在构造的时候,手动设置成公平锁。

        4、读写锁

        将读和写分为两个锁,使多个读线程不会相互等待。

        5、乐观锁和悲观锁

        两者都是顾名思义:乐观锁,就是一种很乐观的想法,认为自己在操作数据的时候,不会有其他任何的更新操作,所以在取数据的时候不加锁,只在提交更新的时候判断是否有人动过该数据,如使用版本号等机制。

        悲观锁,很悲观地认为在自己操作数据的时候,一定会有人操作数据,所以在取数据阶段就加锁,直到更新结束释放锁。数据库中的行锁,表锁,读锁,写锁都是悲观锁的实现。

        如此一分析,显然在读多写少的环境下,乐观锁会比较奏效,因为当并发量很大,乐观锁,便会不停地retry,降低效率。   

    展开全文
  • lock接口和synchronized区别Lock接口可以尝试非阻塞地获取 当前线程尝试获取。如果这一时刻没有被其他线程获取到,则成功获取并持有。 Lock接口能被中断地获取synchronized不同,获取到的线程能够...
  • 上一篇博客写了几种锁,但是没写完,具体的实现没有验证,...2.Lock锁被获得时,有线程在等待可以先中断等待,然后执行其他方法,而Synchronized锁的等待线程则会一直等待着。 3.Lock是用Java写的接口,里面有很...
  • Lock锁的用法Lock锁机制与 synchronized 关键字的区别一、Lock锁的用法 Lock lock = new ReentrantLock(); lock.lock(); try{ //可能会出现线程安全的操作 }finally{ //一定在finally中释放锁 //也不能...
  • 出现lock锁肯定是由于synchronized锁有一些缺陷,下面说一下具体缺陷: 1. 不提供中断锁 synchronized锁有两种情况会释放锁: ①.代码块或者方法执行完毕,自动释放锁 ②.在执行代码块或者方法过程中发生异常,自动...
  • Synchronzied属于我们java中内置关键字,底层jdk帮我们封装好了,lock是基于aqs封装的。 Synchronzied可以理解为自动挡,当代码运行完毕,或者程序抛出异常的情况下才会释放Lock:可以完全人为控制获取,...
  • Java多线程Lock锁 import java.util.concurrent.locks.... //lock锁synchronized区别 private static int ticketNum=10; boolean flag=true; //定义一个lock锁 private final ReentrantLock loc..
  •  如果一个代码块被synchronized修饰了,当一个线程获取了对应的,并执行该代码块时,其他线程便只能一直等待,等待获取的线程释放,而这里获取的线程释放会有三种情况:  1)获取的线程执行完了该...
  • 总结自java.util.concurrent.locks 接口Lock源代码注释lock 支持多个显式的监视器 Condition 。...lock 块,并且多个需要顺序加锁,逆序解锁。并且是在同一个作用范围内加解锁。synchronize...
  • 文章目录一、传统的Synchronized (关键字)二、lock锁 (lock是一个接口)2.1 ReentrantLock 可重入锁中的公平锁与非公平锁2.2与Synchronized不同的加锁方式的买票案例(Lock锁)三、Synchronized Lock区别 ...
  • Lock接口和synchronized的比较 Lock是一个接口,而synchronized是java的一个关键字。 Lock适用于以下场景:获取可以被中断interrupt,超时获取,尝试获取trylock,读多写少用读写。而synchronized就不是可...
  • 实现多线程同步Lock锁synchronized 同步监视器的区别` 线程同步的关键: 确保一个时间点只有一个线程访问共享资源。可以给共享资源加一把锁,哪个线程获取了这把锁,才有权利访问该共享资源。 1.同步监视器 同步...
  • Synchronized和Lock锁有什么区别

    千次阅读 2020-06-21 08:53:51
    Synchronized和Lock锁 1、synchronized是JVM层面实现的,java提供的关键字,Lock是API层面的锁。 2、synchronized不需要手动释放锁,底层会自动释放,Lock则需要手动释放锁,否则有可能导致死锁。 3、synchronized...
  • synchronized和lock锁

    2020-05-20 16:34:59
    synchronized和lock锁 首先对于Java多线程加锁机制,有两种: • Synchronized • 显式Lock 一、synchronized锁 1.1synchronized锁是什么? synchronized是Java的一个关键字,它能够将代码块(****方法)锁起来 • ...
  • lock和synchronized区别

    2019-09-18 09:42:29
    lock和synchronized区别 lock和synchronized区别 ...synchronized和lock都是的意思,都是为了线程安全性, 应用合理性运行效率的。 可以简单理解lock比前置更加优秀合理,是前者 的优化版。...
  •   synchronized: ...  Lock接口提供了与synchronized相似的同步功能,和synchronized(隐式的获取释放,主要体现在线程进入同步代码块之前需要获取退出同步代码块需要释放)不同的是,Loc
  • lock锁是实现了aqs原理的加锁方式,进入方法时,添加死循环结构,获取当前线程进行加锁,然后继续执行代码,后来的线程加锁失败就进入阻塞状态,加入队列中,队列数据结构,先进先出,当加锁的线程释放锁后,队列中...
  • Lock和Synchronized区别

    2020-07-17 13:31:36
    一、synchronized和lock的用法区别 synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要的对象。lock:需要显示指定起始位置终止位置。一般使用...
  • Synchronized Lock锁区别 * 1、 Synchronized 是内置的关键字,Lock是一个Java类 * 2、 Synchronized 无法判断获取锁的状态,Lock可以判断是否获取到了锁 * 3、 Synchronized 会自动释放锁,Lock锁必须要手动...
  • Synchronized和Lock锁区别

    千次阅读 2020-01-07 22:45:32
    面试必问之synchronizedLock区别及底层实现 一共8大区别区别1:Synchronized 是Java的一个关键字, 而Lock是java.util.concurrent.Locks 包下的一个接口; 区别2:Synchronized 使用过后,会自动释放, ...
  • 方法锁主要包括:synchronized和lock锁 区别: 1)Lock是一个接口,而synchronized是Java中的关键字; 2)synchronized当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程...
  • Lock和synchronized区别

    2019-03-04 13:14:34
    Lock和synchronized区别 1、Lock是接口,而synchronized是java的关键字; 2、synchronized发生异常时,自动释放线程占有的,不会导致死锁现象的发生;Lock发生异常时,如果没有通过unLock()释放 ,可能会...
  • Synchronized 如果线程1获得锁,阻塞了,线程二会一直等待, 而lock锁不一定会等待下去(tryLock) 第五、 Synchronized 可重入锁,不可以中断、非公平;Lock 可重入锁、可以判断锁、非公平(可以自己设置); 第六...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,138
精华内容 51,655
关键字:

lock锁和synchronized区别