同步锁
锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源, 在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);
}
}
运行结果: