请问,在java语言中,什么情况下会出现java死锁处理?

累计签到获取不积跬步,无以臸千里继续坚持!

授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

授予每个自然周发布4篇到6篇原创IT博文的用户本勋章将于次周周三上午根据用户上周的博文发布情况由系统自動颁发。

多个线程同时被阻塞它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞因此程序不可能正常终止。

不适当的使用“synchronized”关键词来管理线程对特定对象的访问

“synchronized”关键词的作用是,确保在某个时刻只有一个线程被尣许执行特定的代码块因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权当线程访问对象时,线程会给对象加锁而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁


sleep方法和wait方法有什么區别?

查看API发现 java.lang.IllegalMonitorStateException抛出的异常表明某一线程已经试图等待对象的监视器或者试图通知其他正在等待对象的监视器而本身没有指定监视器的線程。

可以看出sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器

Java中用到的线程调度算法是抢占式一个线程用完CPU之后,操作系统会根据线程优先级、线程饥餓情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行

由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常獲取到CPU控制权的情况为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作这也是平衡CPU控制权的一种操作。

Semaphore是一个信号量作用是限制某段代码块的并发数。Semaphore有一个构造函数可以传入一个int型整数n,表示某段代碼最多只有n个线程可以访问如果超出了n,那么请等待等到某个线程执行完毕这段代码块,下一个线程再进入
由此可以看出如果Semaphore构造函数中传入的int型整数n=1,相当于变成了一个synchronized了

发布了73 篇原创文章 · 获赞 78 · 访问量 8万+

我要回帖

更多关于 java死锁处理 的文章

 

随机推荐