Java多线程详解四 ( 使用Lock锁解决同步问题 )

上一篇文章我们讲解了使用synchronized关键字来解决线程的同步问题,那么本篇文章我们使用Lock锁来解决同步问题
在Java5之后,出了一个新的同步方式就是Lock锁来解决线程安全问题,话不多说直接上代码!

代码

/**
 * @author LFDMW
 * @date 2020-11-14 23:03
 */
public class MyLock implements Runnable {
    /**
     *  首先我们需要创建一个ReentrantLock锁对象这里可以用Lock接收或使用ReentrantLock
     *  ReentrantLock是实现了Lock接口
     */
    ReentrantLock lock = new ReentrantLock();
    private int num = 0;

    @Override
    public void run() {
        while (true) {
            // 在需要加锁的时候调用lock方法,lock方法可以理解为上锁,
            // 这里注意lock方法要与try配合使用,try中是需要被加锁也就是需要处理线程安全的代码
            lock.lock();
            try {
                if (num < 100) {
                    synTest();
                } else {
                    break;
                }
            } finally {
                // 我们加锁之后需要手动解锁,在finally中使用unlock方法即可解锁
                lock.unlock();
            }
        }
    }

    private void synTest() {
        num++;
        System.out.println(Thread.currentThread().getName() + "" + num);
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class MyLockTest {
    public static void main(String[] args) {
        MyLock myLock = new MyLock();
        Thread t1 = new Thread(myLock);
        Thread t2 = new Thread(myLock);
        Thread t3 = new Thread(myLock);
        t1.setName("线程1-");
        t1.start();
        t2.setName("线程2-");
        t2.start();
        t3.setName("线程3-");
        t3.start();
    }
}

总结

方法解读:
lock方法: 对当前线程加锁
unlock方法: 释放当前线程的锁
其实使用方法和synchronized关键字区别不大,只不过Lock锁是显式解锁,所以我们需要手动去解锁,别忘记使用unlock哦!
Lock锁也是只有代码块的,没有直接在方法上声明的
推荐使用Lock锁来解决线程安全问题,因为性能更好,并且具有更好的扩展性,包括synchronized里使用wait,notify等方法,lock锁中也有对应的可以实现通知和等待的方法,我们后面的文章中会讲解!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值