多线程15——Lock锁

文章介绍了Java中Lock(以ReentrantLock为例)与synchronized的异同。Lock是显示锁,需手动开启和关闭,而synchronized是隐式锁,离开作用域自动释放。Lock提供代码块锁,而synchronized有代码块锁和方法锁。Lock在性能和扩展性上可能优于synchronized,并提倡在需要时使用Lock>同步代码块>同步方法。文章通过示例展示了如何使用Lock进行线程安全的售票操作。
摘要由CSDN通过智能技术生成

1、java提供了更强大的线程同步机制——通过显示定义同步锁对象来实现同步。同步锁用lock对象充当

Synchronized和Lock的对比

2、Lock是显示锁(手动开启和手动关闭,别忘记关闭锁),synchronized是隐式锁,出了作用域自动释放

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

4、使用Lock锁,JVM将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性

5、优先使用顺序:

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

以下是案例:

package com.kuang.demo8_lock;


import com.sun.prism.RenderTarget;

import java.util.concurrent.locks.ReentrantLock;

//测试Lock锁
public class TestLock {
    public static void main(String[] args) {
        TestLock2 testLock2 = new TestLock2();

        //未加锁,三个线程操作同一个对象是不安全的
        new Thread(testLock2).start();
        new Thread(testLock2).start();
        new Thread(testLock2).start();
    }
}

class TestLock2 implements Runnable{
    int ticketNums = 10;
    //定义lock锁
    //private 保证安全
    private final ReentrantLock lock = new ReentrantLock();


    @Override
    public void run() {
        while (true){

            try {
                //try里面写保证线程安全的代码
                lock.lock();//哪里要变化,哪里就加锁
                if(ticketNums > 0){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticketNums--);
                }else {
                    break;
                }
            }finally {
                //如果同步代码块有异常,要把unlock()写入finally语句块
                //解锁
                lock.unlock();

            }

        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值