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

12 篇文章 0 订阅

Lock锁

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

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

  1. 从JDK5.0开始,Java提供了更加强大的线程同步机制,Lock是显示锁(手动开启和关闭锁,别忘了关闭锁),同步锁对象来实现同步,同步锁使用Lock对象充当,
  2. java.util.concurrent(并发).locks.Lock接口是控制多个线程对共享资源进行访问的工具,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开启访问共享资源之前应先获得Lock对象
  3. ReentrantLock类实现了Lock,它拥有synchronized相同的并发性和内存语义,在现实线程安全的控制中,比较常用的是ReentrantLock,可以显示加锁,释放锁
    在这里插入图片描述

lock一般代码结构

在这里插入图片描述

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的区别

  1. synchronized是java内置关键字,lock是JUC下的接口
  2. synchronized是隐示锁,出了作用域自动释放(同步方法或者同步代码块),lock是显示锁(手动开启和关闭锁,别忘了关闭锁)
  3. synchronized会自动释放锁,Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁
  4. Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题,使用lock锁,JVM将花费较少的时候来调度线程,性能更好,并且具有更好的扩展性(提供更多子类)
  5. Lock锁只有代码块锁,synchronized有代码块锁和方法锁

优先使用顺序

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

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Java多线程中,使用是为了控制对共享资源的访问,以避免多个线程同时对同一资源进行修改而导致数据不一致或竞态条件的问题。Java提供了两种的机制:synchronized关键字和Lock接口。 1. synchronized关键字: - synchronized关键字可以用来修饰方法或代码块,使其成为同步方法或同步块。 - 当一个线程访问同步方法或同步块时,会自动获取该方法或代码块所在对象的,并在执行完后释放。 - 其他线程在获取之前会被阻塞,直到被释放。 - 示例代码: ```java public synchronized void synchronizedMethod() { // 同步方法 } public void synchronizedBlock() { synchronized (this) { // 同步块 } } ``` 2. Lock接口: - Lock接口是Java提供的显示机制,提供了更灵活的定方式。 - Lock接口的常用实现类是ReentrantLock,它具有与synchronized相似的语义。 - 示例代码: ```java Lock lock = new ReentrantLock(); public void lockMethod() { lock.lock(); try { // 加的代码 } finally { lock.unlock(); // 必须在finally块中释放,以防止异常导致无法释放 } } ``` 在使用时,需要注意以下几点: - 的粒度应尽量小,只定必要的代码块,以减少线程间的竞争。 - 避免死,即多个线程相互等待对方释放的情况。 - 保证的正确使用,避免忘记释放或错误地释放,可以使用try-finally语句块来确保的释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小花皮猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值