java 线程的可重入锁_java 多线程-可重入锁
可重入锁:锁可以连续使用
计数器+判断进入的线程是不是已经锁定的线程,如果是那就不用等待,直接使用
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 多线程-可重入锁相关推荐
- java 同步锁_Java多线程:synchronized同步锁的使用和实现原理
作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...
- java中什么是释放已经持有的锁_java多线程什么时候释放锁
由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁: 1.当前线程的同步方法.代码块执行结束的时候释放 ...
- java 并发锁_Java并发教程–重入锁
java 并发锁 Java的synced关键字是一个很棒的工具–它使我们可以通过一种简单可靠的方式来同步对关键部分的访问,而且也不难理解. 但是有时我们需要对同步进行更多控制. 我们要么需要分别控制访 ...
- java线程 锁_Java多线程(二) 多线程的锁机制
当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...
- java线程池 锁_java多线程——锁
这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...
- java公平索非公平锁_java中的非公平锁不怕有的线程一直得不到执行吗
首先来看公平锁和非公平锁,我们默认使用的锁是非公平锁,只有当我们显示设置为公平锁的情况下,才会使用公平锁,下面我们简单看一下公平锁的源码,如果等待队列中没有节点在等待,则占有锁,如果已经存在等待节点, ...
- java非公平锁_Java多线程 -- 公平锁和非公平锁的一些思考
在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁.相反,如果保证不了每个线程都能拿到锁, ...
- java线程的状态有几种_Java线程的几种可用状态
1. 新建( new ):新创建了一个线程对象. 2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start()方法.该状态的线程位于可运行线程 ...
- java线程池延期执行一次_Java使用者的延期执行
java线程池延期执行一次 在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所 ...
最新文章
- 祭旗篇---关于提高技术团队技术氛围的一些尝试
- 服务器论坛有哪些_SEO工作中,经常使用的无效外链有哪些?
- dhcp配置(个人)
- sdut2772 KMP的简单应用
- LiteDB源码解析系列(3)索引原理详解
- 秦叶阳(1986-),女,就职于北京大学,安徽荣创智能科技有限公司联合创始人...
- 数组中其余的排除_6.8 C++字符数组 | 输出a、b、c
- 鼠标滑轮滚动到相应位置,对应位置的div触发一些效果实现方式
- Android 读取手机归属地
- html css 书签,CSS实现书签图案的效果
- L1-049 天梯赛座位分配 (20分)
- Android浮窗实现(WindowManager)
- IOS苹果开发者账号封号的规避心得,利用好防关联工具避免APP下架问题
- 多屏互动之Windows与Mac下的非自带的远程桌面应用
- linux设备驱动中的module_init
- Codeforces868A Bark to Unlock
- 大数据集群失联问题解决方案
- 洗车店小程序开发设计(微信同城预约洗车源码搭建费用)
- 图片预览-放大镜效果
- R语言paste()函数的使用