Java多线程-简单使用Lock(锁)

简介: 笔记

Lock锁


加锁:lock(),解锁:unLock(),一般放在try catch finally中使用


lock是JUC(并发)下的一个接口,一般用它的实现类ReentrantLock(可重入锁)比较多


从JDK5.0开始,Java提供了更加强大的线程同步机制,Lock是显示锁(手动开启和关闭锁,别忘了关闭锁),同步锁对象来实现同步,同步锁使用Lock对象充当,

java.util.concurrent(并发).locks.Lock接口是控制多个线程对共享资源进行访问的工具,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开启访问共享资源之前应先获得Lock对象

ReentrantLock类实现了Lock,它拥有synchronized相同的并发性和内存语义,在现实线程安全的控制中,比较常用的是ReentrantLock,可以显示加锁,释放锁

2.png

lock一般代码结构


3.png

lock加锁线程安全案例


package com.wyh.thread;
import java.util.concurrent.locks.ReentrantLock;
/**
 * @program: Thread
 * @description: 测试lock锁
 * @author: 魏一鹤
 * @createDate: 2022-01-16 20:48
 **/
public class TestLock {
     public static void main(String[] args){
         Lock lock = new Lock();
         new Thread(lock, "张三").start();
         new Thread(lock,"李四").start();
         new Thread(lock,"王五").start();
     }
}
class Lock implements  Runnable{
    //票数
    int nums=10;
    //定义lock锁
    private  final  ReentrantLock reentrantLock=new ReentrantLock();
    @Override
    public void run() {
        while (true) {
            try {
                reentrantLock.lock();//加锁
                if (nums > 0) {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + "买到了" + nums-- + "张票");
                } else {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //解锁
                reentrantLock.unlock();
            }
        }
    }
}

synchronzied和lock的区别


synchronized是java内置关键字,lock是JUC下的接口

synchronized是隐示锁,出了作用域自动释放(同步方法或者同步代码块),lock是显示锁(手动开启和关闭锁,别忘了关闭锁)

synchronized会自动释放锁,Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁

Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题,使用lock锁,JVM将花费较少的时候来调度线程,性能更好,并且具有更好的扩展性(提供更多子类)

Lock锁只有代码块锁,synchronized有代码块锁和方法锁


优先使用顺序


Lock锁>同步代码块(已经进入了方法体,分配了相应资源)>同步方法(在方法体外)


相关文章
|
4天前
|
安全 Java UED
Java中的多线程编程:从基础到实践
本文深入探讨了Java中的多线程编程,包括线程的创建、生命周期管理以及同步机制。通过实例展示了如何使用Thread类和Runnable接口来创建线程,讨论了线程安全问题及解决策略,如使用synchronized关键字和ReentrantLock类。文章还涵盖了线程间通信的方式,包括wait()、notify()和notifyAll()方法,以及如何避免死锁。此外,还介绍了高级并发工具如CountDownLatch和CyclicBarrier的使用方法。通过综合运用这些技术,可以有效提高多线程程序的性能和可靠性。
|
3天前
|
缓存 Java UED
Java中的多线程编程:从基础到实践
【10月更文挑战第13天】 Java作为一门跨平台的编程语言,其强大的多线程能力一直是其核心优势之一。本文将从最基础的概念讲起,逐步深入探讨Java多线程的实现方式及其应用场景,通过实例讲解帮助读者更好地理解和应用这一技术。
19 3
|
5天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
13 2
|
7天前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
2天前
|
缓存 算法 Java
|
5月前
|
安全 Java
深入理解Java并发编程:线程安全与性能优化
【2月更文挑战第22天】在Java并发编程中,线程安全和性能优化是两个重要的主题。本文将深入探讨这两个主题,包括线程安全的基本概念,如何实现线程安全,以及如何在保证线程安全的同时进行性能优化。
51 0
|
5月前
|
存储 安全 Java
深入理解Java并发编程:线程安全与锁机制
【5月更文挑战第31天】在Java并发编程中,线程安全和锁机制是两个核心概念。本文将深入探讨这两个概念,包括它们的定义、实现方式以及在实际开发中的应用。通过对线程安全和锁机制的深入理解,可以帮助我们更好地解决并发编程中的问题,提高程序的性能和稳定性。
|
2月前
|
存储 安全 Java
解锁Java并发编程奥秘:深入剖析Synchronized关键字的同步机制与实现原理,让多线程安全如磐石般稳固!
【8月更文挑战第4天】Java并发编程中,Synchronized关键字是确保多线程环境下数据一致性与线程安全的基础机制。它可通过修饰实例方法、静态方法或代码块来控制对共享资源的独占访问。Synchronized基于Java对象头中的监视器锁实现,通过MonitorEnter/MonitorExit指令管理锁的获取与释放。示例展示了如何使用Synchronized修饰方法以实现线程间的同步,避免数据竞争。掌握其原理对编写高效安全的多线程程序极为关键。
58 1
|
3月前
|
安全 Java 开发者
Java并发编程中的线程安全问题及解决方案探讨
在Java编程中,特别是在并发编程领域,线程安全问题是开发过程中常见且关键的挑战。本文将深入探讨Java中的线程安全性,分析常见的线程安全问题,并介绍相应的解决方案,帮助开发者更好地理解和应对并发环境下的挑战。【7月更文挑战第3天】
81 0
|
4月前
|
安全 Java 开发者
Java并发编程中的线程安全策略
在现代软件开发中,Java语言的并发编程特性使得多线程应用成为可能。然而,随着线程数量的增加,如何确保数据的一致性和系统的稳定性成为开发者面临的挑战。本文将探讨Java并发编程中实现线程安全的几种策略,包括同步机制、volatile关键字的使用、以及java.util.concurrent包提供的工具类,旨在为Java开发者提供一系列实用的方法来应对并发问题。
40 0