A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 郝永亮 于 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();
     }
}



9 个回复

正序浏览
回复 使用道具 举报
顶顶顶顶顶起来
回复 使用道具 举报
回复 使用道具 举报
Vicky韦 来自手机 黑马粉丝团 2018-12-19 13:48:29
7#
真好
回复 使用道具 举报
优秀
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
沙发
回复 使用道具 举报
收藏收藏
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马