通过实例解析synchronized和lock区别

 更新时间:2020年12月09日 08:27:49   作者:北方有鱼  
这篇文章主要介绍了通过实例解析synchronized和lock区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1,原始构成

synchronized是关键字,属于JVM层面,通过wait,notify和notifyAll来调度线程。

Lock是具体类,是api层面的锁。

2,使用方法

synchronized不需要用户手动去释放锁, 当synchronized代码执行完后,系统会自动释放锁。

Lock需要用户手动释放锁,否则会出现死锁现象。需要lock和unlock配合try/finally语句块来完成。

3,等待是否中断

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

Lock可中断,可以设置超时方法或者调用中断方法。

4,加锁是否公平

synchronized非公平锁。

Lock默认非公平锁,可指定为公平锁。

5,锁绑定多个条件condition

synchronized没有。

Lock用来分组唤醒需要唤醒的线程,可以精确唤醒,而不是像synchronized一样要么随机唤醒一个线程,要么全部唤醒。

Demo: 练习

  多线程之间按顺序调用,实现A->B->C三个线程启动,要求:AA打印5次,BB打印10次,CC打印15次,重复10遍。

package com.demo.lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class ShareResource{
  int number = 1;
  private Lock lock = new ReentrantLock();
  
  private Condition c1 = lock.newCondition();
  private Condition c2 = lock.newCondition();
  private Condition c3 = lock.newCondition();
  
  public void print5(){
    lock.lock();
    try {
      while(number!=1){
        c1.await();
      }
      for(int i=1;i<=5;i++){
        System.out.println(Thread.currentThread().getName()+"\t"+i);
      }
      number = 2;
      c2.signal();
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      lock.unlock();
    }
  }
  
  public void print10(){
    lock.lock();
    try {
      while(number!=2){
        c2.await();
      }
      for(int i=1;i<=10;i++){
        System.out.println(Thread.currentThread().getName()+"\t"+i);
      }
      number = 3;
      c3.signal();
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      lock.unlock();
    }
  }
  
  public void print15(){
    lock.lock();
    try {
      while(number!=3){
        c3.await();
      }
      for(int i=1;i<=15;i++){
        System.out.println(Thread.currentThread().getName()+"\t"+i);
      }
      number = 1;
      c1.signal();
    } catch (Exception e) {
      e.printStackTrace();
    }finally{
      lock.unlock();
    }
  }
}
public class TestReentrantLock {

  public static void main(String[] args) {
    ShareResource shareResource = new ShareResource();
    
    new Thread(()->{
      for(int i=1;i<=10;i++){
        shareResource.print5();
      }
    },"AA").start();
    
    new Thread(()->{
      for(int i=1;i<=10;i++){
        shareResource.print10();
      }
    },"BB").start();
    
    new Thread(()->{
      for(int i=1;i<=10;i++){
        shareResource.print15();
      }
    },"CC").start();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Springboot静态资源的访问方法介绍

    Springboot静态资源的访问方法介绍

    最近在做SpringBoot项目的时候遇到了“白页”问题,通过查资料对SpringBoot访问静态资源做了总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 详解Spring Aop实例之xml配置

    详解Spring Aop实例之xml配置

    本篇文章主要介绍了详解Spring Aop实例之xml配置,使用xml可以对aop进行集中配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 图解Java ReentrantLock的条件变量Condition机制

    图解Java ReentrantLock的条件变量Condition机制

    想必大家都使用过wait()和notify()这两个方法把,他们主要用于多线程间的协同处理。而RenentrantLock也支持这样条件变量的能力,而且相对于synchronized 更加强大,能够支持多个条件变量,本文就来详细说说
    2022-10-10
  • Java实现数据库连接的最详细教程分享

    Java实现数据库连接的最详细教程分享

    JDBC,Java Database Connectivity,即Java数据库连接,是 Java 中的一套和数据库进行交互的API,本文就来讲讲Java如何利用JDBC实现数据库的连接吧
    2023-05-05
  • java环境变量为什么要配置path和classpath详细解答

    java环境变量为什么要配置path和classpath详细解答

    为何配置path?为何配置classpath?当时初学java时只是关心如何做而不去关心这些问题,接下来介绍一下,感兴趣的朋友可以参考下哦
    2013-01-01
  • 优化MyBatis配置文件中的配置详解

    优化MyBatis配置文件中的配置详解

    这篇文章主要介绍了优化MyBatis配置文件中的配置详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • MAVEN的安装配置与IDEA整合超详细教程

    MAVEN的安装配置与IDEA整合超详细教程

    这篇文章给大家介绍了MAVEN的安装,配置与IDEA整合方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友跟随小编一起看看吧
    2021-02-02
  • Java中的几种关键字的使用小结

    Java中的几种关键字的使用小结

    本文主要介绍了Java中的几种关键字的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 解读@ConfigurationProperties的基本用法

    解读@ConfigurationProperties的基本用法

    这篇文章主要介绍了@ConfigurationProperties的基本用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略问题

    RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略问题

    这篇文章主要介绍了RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论