通过线程dump,我们获得了一个正在执行的java程序的线程信息。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过线程dump,我们获得了一个正在执行的java程序的线程信息。相关的知识,希望对你有一定的参考价值。

经过整理,我们发现线程占用锁和等待锁的信息格式如下:
T1 L1,L2 L3

T2 L4 L5

T3 L3 L4

T4 L5 L6

T5 L6 L1
第一列是线程id,第二列是该线程持有的锁id,第三列是该线程等待的锁id;列之间是以空格分隔的,锁id之间是以,分隔。请用程类序似数据,确定是否有线程处于死锁状态,并将处于死锁的线程id打印出来。
请在完成编程后,写一个程序说明,描述下你对个程序的设计、实现上的考虑,比如性能、可维护性、可扩展性等。
请以文件形式上传到我的知道,不要公开回答。
c或c++语言编写程序

参考技术A 我主要是弄java的,,死锁的原因你看看他们直接调用是不是死循环了?资源一直占用着,而别的线程又要调用追问

谢谢~

Java中的锁

1.可重入锁

synchronized和Lock都是可重入锁

表明了锁的分配机制是基于线程,而不是基于方法

例如,在一个同步方法中调用了另一个同步方法,再进入第二个同步方法时,不需要重新申请锁

 

2.可中断锁

synchronized是不可中断的。

  一个线程已经获得了某对象的锁,另一个线程想获得该对象的锁时,必须等待,直到第一个线程释放锁(执行完、异常)

Lock调用lockInterruptibly方法获得锁时,是可中断的。

  一个线程已经获得了某对象的锁,另一个线程想获得该对象的锁时,等待,在等待过程中,可以调用该线程的interrupt方法终端等待

 

3.公平锁、非公平锁

公平锁:按照请求的顺序获得锁

非公平锁:不保证获取锁的顺序,吞吐量高,造成优先级反转或者饥饿现象(有的线程一直等待)

synchronized是非公平锁

Lock的实现类:ReentrantLock它默认情况下是非公平锁,在创建相应对象时,使用重载的构造器,传入参数(true),设置成公平锁

 

 4.共享锁、排它锁

共享锁:锁可以被多个线程持有

排它锁:锁只能被一个线程持有

synchronized和Lock都是排它锁

ReadWriteLock(读写锁),其读锁是共享锁,写锁是排它锁

  

  实现类ReentrantReadWriteLock

    

5.乐观锁、悲观锁

乐观锁:对同一数据的并发操作,乐观地认为不会发生修改,在更新数据的时候,尝试更新(版本)

悲观锁:对同一数据的并发操作,悲观地认为一定会发生修改,加锁

乐观锁:CAS

 

6.分段锁

分段锁是一种锁的设计(ConcurrentHashMap)

 

7.偏向锁/轻量级锁/重量级锁

jdk1.5引入的锁升级机制,实现高效的synchronized

偏向锁:若同步代码之一被一个线程访问,则该线程自动获取锁

轻量级锁:锁是偏向锁时,另一线程访问同步代码,偏向锁上升为轻量级锁,另一线程采用自旋形式获取锁,不会阻塞

重量级锁,锁是轻量级锁时,另一线程自旋一定次数之后仍未获得锁,阻塞,轻量级锁上升为重量级锁

 

8.自旋锁

  尝试获得锁的线程不会立即阻塞,而是采用循环的方式尝试获取锁,减少上下文切换的消耗,但是循环会消耗CPU

 

以上是关于通过线程dump,我们获得了一个正在执行的java程序的线程信息。的主要内容,如果未能解决你的问题,请参考以下文章

java 第60节 死锁问题

Java线程阻塞

tomcat的3个线程栈dump样本分析

java 第53节 线程基本知识

Java线程-线程的基本状态

线程的对象方法