Java多线程中Lock锁的使用小结

Lock基本使用

Lock它是java.util.concurrent.locks下的一个接口,它也是用来处理线程同步问题的。

public interface Lock {
    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}
  • lock()获取锁,如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到获得锁为止。
  • lockInterruptibly()除非当前线程被中断,否则获取锁。如果可用,则获取锁并立即返回。如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到锁被当前线程获取或者其它线程中断当前线程。
  • tryLock()这种用法确保锁在获得时解锁,并且在未获得锁时不尝试解锁。返回布尔类型(true/false)。
  • tryLock(long time, TimeUnit unit)如果在给定的等待时间内空闲并且当前线程没有被中断,则获取锁,如果锁可用,则此方法立即返回值true 。如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到当前线程获取锁,或被中断,或指定的等待时间已到。
  • unlock()释放锁。
  • newCondition()返回绑定到此Lock实例的新Condition实例。

因为它只是接口,所以我们需要找到它的实现类,下面重点给大家介绍ReentrantLock,它也是我们工作中常用的

ReentrantLock

它是一种可重入互斥Lock ,其基本行为和语义与使用synchronized方法和语句访问的隐式监视器锁相同,但具有扩展功能。

说了这么多,还没带大家体验一把,下面我们就是来个例子试一下。

public class LockTest {
    private static Lock lock = new ReentrantLock();
    private static  int count = 0;
    private static void add() {
        try {
            //加锁
            lock.lock();
            count++;
            //重入锁
            reduce();
        } finally {
            // 记得释放锁
            lock.unlock();
            System.out.println(count);
        }
    }
    private static void reduce(){
        // 加锁
        lock.lock();
        count--;
        // 释放锁
        lock.unlock();
    }
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 100; i++) {
            new Thread(LockTest::add).start();
        }
    }
}

我们发现无论执行多少次结果都是和预期的一样,都是0,我们再看下tryLock,直接改写reduce:

private static void reduce1(){
    if(lock.tryLock()) {
        try {
            count--;
        }finally {
            // 释放锁
            lock.unlock();
        }
    }else {
        System.out.println("no");
    }
}

通过上面的使用,我们来和Synchronized做一个对比。

  • 表面上一个是关键字,一个是类。
  • 使用上,Synchronized隐式,而Lock需要显示,对代码要求比较高,如果忘了释放锁可能会导致死锁。
  • Lock提供了tryLock方法,使得程序更加灵活。
  • 代码表现上Lock更加的灵活,可以在不同的方法中执行。

结束语

本节主要讲了它的基本使用,大家可以举一反三,试试什么条件下会导致死锁。

到此这篇关于Java多线程中Lock锁的使用小结的文章就介绍到这了,更多相关java lock锁使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java多线程中Lock锁的使用总结

    多核时代 摩尔定律告诉我们:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍.换言之,每一美元所能买到的电脑性能,将每隔18个月翻两倍以上.然而最近摩尔定律似乎遇到了麻烦,目前微处理器的集成度似乎到了极限,在目前的制造工艺和体系架构下很难再提高单个处理器的速度了,否则它就被烧坏了.所以现在的芯片制造商改变了策略,转而在一个电路板上集成更多的处理器,也就是我们现在常见的多核处理器. 这就给软件行业带来麻烦(也可以说带来机会,比如说就业机会,呵呵).原来的情况

  • Javas使用Redlock实现分布式锁过程解析

    一.redlock简介 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 效率属性A:不会死锁 效率属性B:容错,只要大多数redis节点能够正常工作,客户端端都能获取和释放锁. Redlock是redis官方提出的实现分布式锁管理器的算法.这个算法会比一般的普通方法更加安全可靠.关于这个算法的讨论可以看下官方文档. 二.怎么用java使用 redlock 在pom文件引入redis和

  • java多线程并发中使用Lockers类将多线程共享资源锁定

    复制代码 代码如下: package com.yao; import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.c

  • Java中的显示锁ReentrantLock使用与原理详解

    考虑一个场景,轮流打印0-100以内的技术和偶数.通过使用 synchronize 的 wait,notify机制就可以实现,核心思路如下: 使用两个线程,一个打印奇数,一个打印偶数.这两个线程会共享一个数据,数据每次自增,当打印奇数的线程发现当前要打印的数字不是奇数时,执行等待,否则打印奇数,并将数字自增1,对于打印偶数的线程也是如此 //打印奇数的线程 private static class OldRunner implements Runnable{ private MyNumber n

  • Java lock同步锁使用实例解析

    这篇文章主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就

  • Java多线程中Lock锁的使用小结

    Lock基本使用 Lock它是java.util.concurrent.locks下的一个接口,它也是用来处理线程同步问题的. public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void

  • c#多线程中Lock()关键字的用法小结

    本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待. 每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. 其中,lock是一种比较好用的简单的线程同步方式,它是通过为给定对象获取互斥锁来实现同步的.它可以保证当一个线程在关键

  • 解析Java多线程之常见锁策略与CAS中的ABA问题

    目录 1.常见的锁策略 1.1乐观锁与悲观锁 1.2读写锁与普通互斥锁 1.3重量级锁与轻量级锁 1.4挂起等待锁与自旋锁 1.5公平锁与非公平锁 1.6可重入锁与不可重入锁 1.7死锁问题 1.7.1常见死锁的情况 1.7.2哲学家就餐问题 2.CAS指令与ABA问题 2.1CAS指令 2.2ABA问题 本篇文章将介绍常见的锁策略以及CAS中的ABA问题,前面介绍使用synchronized关键字来保证线程的安全性,本质上就是对对象进行加锁操作,synchronized所加的锁到底是什么类型的

  • 对python多线程中互斥锁Threading.Lock的简单应用详解

    一.线程共享进程资源 每个线程互相独立,相互之间没有任何关系,但是在同一个进程中的资源,线程是共享的,如果不进行资源的合理分配,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为"线程不安全". 实例如下: #-*- coding: utf-8 -*- import threading import time def test_xc(): f = open("test.txt","a") f.write("test_dxc&quo

  • 对python多线程中Lock()与RLock()锁详解

    资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源的争用,甚至导致死锁 也可能导致读写混乱 锁提供如下方法: 1.Lock.acquire([blocking]) 2.Lock.release() 3.threading.Lock() 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取 4.threading.RLock() 多重锁,在同一线程中可用被多次acquire.如果使用RLock,那么acquire和release必须成对出现,

  • Java多线程中线程间的通信实例详解

    Java多线程中线程间的通信 一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.util.List; public class MyList { private volatile static List list = new ArrayList(); public void add() { list.add("apple"); } publ

  • 浅谈多线程中的锁的几种用法总结(必看)

    一.ReentrantLock package com.ietree.basicskill.mutilthread.lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created by Administrator on 2017/5/17. */ public class UseReentrantLock { private Lock lock

  • Java多线程之显示锁和内置锁总结详解

    总结多线程之显示锁和内置锁 Java中具有通过Synchronized实现的内置锁,和ReentrantLock实现的显示锁,这两种锁各有各的好处,算是互有补充,这篇文章就是做一个总结. *Synchronized* 内置锁获得锁和释放锁是隐式的,进入synchronized修饰的代码就获得锁,走出相应的代码就释放锁. synchronized(list){ //获得锁 list.append(); list.count(); }//释放锁 通信 与Synchronized配套使用的通信方法通常

  • Java多线程中不同条件下编写生产消费者模型方法介绍

    简介: 生产者.消费者模型是多线程编程的常见问题,最简单的一个生产者.一个消费者线程模型大多数人都能够写出来,但是一旦条件发生变化,我们就很容易掉进多线程的bug中.这篇文章主要讲解了生产者和消费者的数量,商品缓存位置数量,商品数量等多个条件的不同组合下,写出正确的生产者消费者模型的方法. 欢迎探讨,如有错误敬请指正 生产消费者模型 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品.生产消费者模式

随机推荐