一、什么是锁?
锁是用来解决多线程并发访问共享资源所带来的数据安全性问题的手段。对一个共享资源加锁后,如果有一个线程获得了锁,那么其他线程无法访 问这个共享资源
二、重入锁
1.概念
一个持有锁的线程,在释放锁之前,如果再次访问加了该同步锁的其他方法,这个线程不需要再次争抢锁,只需要记录重入次数。
2.ReentrantLock
//可重入锁
public class ReentrantLockTest {
static Lock lock = new ReentrantLock();
static int i = 0;
public static void add(){
lock.lock();//加锁
try {
Thread.sleep(1);
i += 2;//只会由一个线程来执行
decr();
}catch (InterruptedException e){
e.printStackTrace();
}finally {
lock.unlock();//释放锁
}
}
public static void decr(){
lock.lock();//同一线程再次去获取锁的时候,无需争抢锁,只需要记录重入次数
try {
i--;
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
for (int j = 0; j < 1000; j++) {
new Thread(ReentrantLockTest::add).start();
}
TimeUnit.SECONDS.sleep(15);
System.out.println(i);
}
}