可重入锁:锁可以连续使用

计数器+判断进入的线程是不是已经锁定的线程,如果是那就不用等待,直接使用

public class my {

public static void main(String[]args)

{

my m=new my();

m.test();

}

public void test()

{

synchronized(this)//第一次获得锁

{

while(true)

{

synchronized(this)//第二次获得锁,假如没有可重入锁,将会造成死锁

{

System.out.println("relock");

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

手工实现:

public class my {

Lock lock=new Lock();

public void a() throws InterruptedException

{

lock.lock();

System.out.println(lock.getCount());

b();

lock.unlock();

System.out.println(lock.getCount());

}

public void b() throws InterruptedException

{

lock.lock();

System.out.println(lock.getCount());

//..

lock.unlock();

System.out.println(lock.getCount());

}

public static void main(String[]args) throws InterruptedException

{

my m=new my();

m.a();

Thread.sleep(1000);

System.out.println(m.lock.getCount());

}

}

class Lock{

//是否占用

private boolean isLocked=false;

private Thread lockedBy=null;//存储线程,如果是自身就不等了

private int count=0;

//使用锁

public synchronized void lock() throws InterruptedException

{

Thread t=Thread.currentThread();

while(isLocked&&lockedBy!=t)//如果被锁住了,且不是当前线程

{

wait();

}

isLocked=true;

lockedBy=t;

count++;

}

//释放锁

public synchronized void unlock()

{

if(Thread.currentThread()==lockedBy)

{

count--;

if(count==0)

{

isLocked=false;

notify();

lockedBy=null;

}

}

isLocked=false;

notify();

}

public int getCount() {

return count;

}

public void setCount(int count) {

this.count = count;

}

}

java 线程的可重入锁_java 多线程-可重入锁相关推荐

  1. java 同步锁_Java多线程:synchronized同步锁的使用和实现原理

    作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...

  2. java中什么是释放已经持有的锁_java多线程什么时候释放锁

    由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁: 1.当前线程的同步方法.代码块执行结束的时候释放 ...

  3. java 并发锁_Java并发教程–重入锁

    java 并发锁 Java的synced关键字是一个很棒的工具–它使我们可以通过一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访 ...

  4. java线程 锁_Java多线程(二) 多线程的锁机制

    当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...

  5. java线程池 锁_java多线程——锁

    这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...

  6. java公平索非公平锁_java中的非公平锁不怕有的线程一直得不到执行吗

    首先来看公平锁和非公平锁,我们默认使用的锁是非公平锁,只有当我们显示设置为公平锁的情况下,才会使用公平锁,下面我们简单看一下公平锁的源码,如果等待队列中没有节点在等待,则占有锁,如果已经存在等待节点, ...

  7. java非公平锁_Java多线程 -- 公平锁和非公平锁的一些思考

    在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁.相反,如果保证不了每个线程都能拿到锁, ...

  8. java线程的状态有几种_Java线程的几种可用状态

    1. 新建( new ):新创建了一个线程对象. 2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start()方法.该状态的线程位于可运行线程 ...

  9. java线程池延期执行一次_Java使用者的延期执行

    java线程池延期执行一次 在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所 ...

最新文章

  1. 祭旗篇---关于提高技术团队技术氛围的一些尝试
  2. 服务器论坛有哪些_SEO工作中,经常使用的无效外链有哪些?
  3. dhcp配置(个人)
  4. sdut2772 KMP的简单应用
  5. LiteDB源码解析系列(3)索引原理详解
  6. 秦叶阳(1986-),女,就职于北京大学,安徽荣创智能科技有限公司联合创始人...
  7. 数组中其余的排除_6.8 C++字符数组 | 输出a、b、c
  8. 鼠标滑轮滚动到相应位置,对应位置的div触发一些效果实现方式
  9. Android 读取手机归属地
  10. html css 书签,CSS实现书签图案的效果
  11. L1-049 天梯赛座位分配 (20分)
  12. Android浮窗实现(WindowManager)
  13. IOS苹果开发者账号封号的规避心得,利用好防关联工具避免APP下架问题
  14. 多屏互动之Windows与Mac下的非自带的远程桌面应用
  15. linux设备驱动中的module_init
  16. Codeforces868A Bark to Unlock
  17. 大数据集群失联问题解决方案
  18. 洗车店小程序开发设计(微信同城预约洗车源码搭建费用)
  19. 图片预览-放大镜效果
  20. R语言paste()函数的使用

热门文章

  1. 树大招风:英伟达证实遭遇攻击,核心源代码惨遭泄露,75GB机密数据被公开
  2. 瑞典正成为欧洲硅谷?
  3. 牛人三个月内花不到 5000 美元拿到 CS 学位
  4. 你熟知的开源项目,幕后推手竟然是他们?
  5. 第二十二届中国科协年会开幕,百度CTO王海峰等共话产业发展机遇
  6. 开发者批评苹果商店佣金过高,库克将面临立法者质疑;花呗接入央行征信;GitHub 发布更新| 极客头条
  7. Android 上哪个更好:除以 2 还是位移 1?
  8. 计算机编程的 20 年变迁!
  9. 5G + 云网融合,加速万物互联
  10. 漫画:去掉一个数,如何让剩余的数乘积最大?