java 多线程-可重入锁
2019-08-18 23:39
1321 查看
可重入锁:锁可以连续使用
计数器+判断进入的线程是不是已经锁定的线程,如果是那就不用等待,直接使用
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多线程(九)之ReentrantLock与Condition
- java实现多线程的socket通信技术
- Java 多线程
- java之12天 多线程 (一)
- java中的多线程
- Java多线程探究-线程同步
- JAVA多线程实现的三种方式
- 多线程编程——java
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- java多线程脏读演式
- Java多线程:CopyOnWrite容器
- 【转载】 J2SE知识点归纳笔记(五)---Java多线程(一)
- 黑马程序员——Java基础——多线程(二)
- Java 多线程:volatile 多线程同步关键字
- (十八)java多线程之Callable Future
- 从jvm的角度来看java的多线程
- JAVA多线程编程核心技术-1