本帖最后由 郝永亮 于 2018-12-19 10:51 编辑
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 ReentrantLock(轻量级)等等 ) 。这些已经写好提供的锁为我们开发提供了便利。
重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁
[Java] 纯文本查看 复制代码 public class Test implements Runnable {
public synchronized void get() {//get方法获取this锁
System.out.println("name:" + Thread.currentThread().getName() + " get();");
set();//get方法调用set方法,set方法也可以获取到this锁,这就是重入锁
}
public synchronized void set() {
System.out.println("name:" + Thread.currentThread().getName() + " set();");
}
@Override
public void run() {
get();
}
public static void main(String[] args) {
Test ss = new Test();
new Thread(ss).start();
new Thread(ss).start();
new Thread(ss).start();
new Thread(ss).start();
}
}
[Java] 纯文本查看 复制代码 public class Test02 extends Thread {
ReentrantLock lock = new ReentrantLock();
public void get() {
lock.lock();//GET方法获取锁
System.out.println(Thread.currentThread().getId());
set();//GET方法调用SET方法,SET方法也获取同样的锁,这把锁lock就是重入锁
lock.unlock();
}
public void set() {
lock.lock();
System.out.println(Thread.currentThread().getId());
lock.unlock();
}
@Override
public void run() {
get();
}
public static void main(String[] args) {
Test ss = new Test();
new Thread(ss).start();
new Thread(ss).start();
new Thread(ss).start();
}
}
|