重入锁

同步锁

锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源, 在Lock接口出现之前,Java应用程序只能依靠synchronized关键字来实现同步锁的功能,在java5以后,增加了JUC 的并发包且提供了Lock接口用来实现锁的功能,它提供了与synchroinzed关键字类似的同步功能,只是它比 synchronized更灵活,能够显示的获取和释放锁。

Lock的初步使用

Lock是一个接口,核心的两个方法lock和unlock,它有很多的实现,比如ReentrantLock、 ReentrantReadWriteLock;

ReentrantLock 重入锁,

表示支持重新进入的锁,也就是说,如果当前线程t1通过调用lock方法获取了锁之后,再次调用lock,是 不会再阻塞去获取锁的,直接增加重试次数就行了。

加锁前:

package com.example.demo.morethread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 重入锁
 * 重入锁,表示支持重新进入的锁,也就是说,如果当前线程t1通过调用lock方法获取了锁之后,再次调用lock,是
 * 不会再阻塞去获取锁的,直接增加重试次数就行了。
 */
public class ReentrantLockDemo {
    private static int count=0;
   static Lock lock=new ReentrantLock();

   public static void inc(){
       //lock.lock();
       try {
           System.out.println("线程:"+Thread.currentThread().getName());
           Thread.sleep(2);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       count++;
       System.out.println(Thread.currentThread().getName()+":"+count);
      // lock.unlock();
   }

    public static void main(String[] args) throws InterruptedException {
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程1").start();
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程2").start();
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程3").start();
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程4").start();
        Thread.sleep(3000);
        System.out.println("result:"+count);
    }

}

运行结果:

加锁后:
 

package com.example.demo.morethread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 重入锁
 * 重入锁,表示支持重新进入的锁,也就是说,如果当前线程t1通过调用lock方法获取了锁之后,再次调用lock,是
 * 不会再阻塞去获取锁的,直接增加重试次数就行了。
 */
public class ReentrantLockDemo {
    private static int count=0;
   static Lock lock=new ReentrantLock();

   public static void inc(){
       lock.lock();
       try {
           System.out.println("线程:"+Thread.currentThread().getName());
           Thread.sleep(2);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       count++;
       System.out.println(Thread.currentThread().getName()+":"+count);
       lock.unlock();
   }

    public static void main(String[] args) throws InterruptedException {
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程1").start();
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程2").start();
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程3").start();
           new Thread(() -> {
               ReentrantLockDemo.inc();
           },"线程4").start();
        Thread.sleep(3000);
        System.out.println("result:"+count);
    }

}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值