java写一个会导致死锁的程序
来源:互联网 发布:js获取选择文件的路径 编辑:程序博客网 时间:2024/05/18 07:15
什么是死锁?
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
不适当的使用“synchronized”关键词来管理线程对特定对象的访问。
“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。
package com.练习锁;public class Test { static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] args) { new Thread(new Runnable() { public void run() { synchronized (o1) { System.out.println("线程1锁o1"); try { Thread.sleep(1000);//让当前线程睡眠,保证让另一线程得到o2,防止这个线程启动一下连续获得o1和o2两个对象的锁。 synchronized (o2) { System.out.println("线程1锁o2"); } } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { public void run() { synchronized (o2) { System.out.println("线程2锁o2"); synchronized (o1) { System.out.println("线程2锁o1"); } } } }).start(); }}
结果:
线程1锁o1
线程2锁o2
sleep方法和wait方法有什么区别?
此时如果把sleep()换成wait()会出现
线程1锁o1Exception in thread "Thread-0" 线程2锁o2线程2锁o1java.lang.IllegalMonitorStateException
查看API发现 java.lang.IllegalMonitorStateException抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
可以看出,sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器
Thread.sleep(0)的作用是什么?
Java中用到的线程调度算法是抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。
由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡CPU控制权的一种操作。
Semaphore有什么作用?
Semaphore是一个信号量,作用是限制某段代码块的并发数。Semaphore有一个构造函数,可以传入一个int型整数n,表示某段代码最多只有n个线程可以访问,如果超出了n,那么请等待,等到某个线程执行完毕这段代码块,下一个线程再进入。
由此可以看出如果Semaphore构造函数中传入的int型整数n=1,相当于变成了一个synchronized了。
- java写一个会导致死锁的程序
- java怎么编程写一个能导致死锁的程序
- Java写一个简单的死锁程序
- 如何写一个死锁的java程序
- 如何用java写一个死锁的程序
- 写一个死锁程序
- java写一个死锁
- java写的一个死锁例子
- java写一个死锁的简单例子
- java-写一个死锁的案例
- 写一个java死锁的demo
- 如何写出一个会产生死锁的程序
- SendMessage会导致死锁的问题
- Java一个简单的死锁程序
- java线程:一个死锁的小程序
- Java编写一个死锁的程序
- java自己动手写一个死锁
- 写一个完整的程序,实现线程死锁
- 卷积神经网络VGG
- js对日期加减指定天、时、分、秒
- Mysql数据库支持Emoji表情
- QT DEBUG问题
- Java面试经验
- java写一个会导致死锁的程序
- Mac OS X下Maven的安装与配置
- C语言实现单链表面试题-------进阶篇
- Scala--占位符
- Teamviewer提示我,试用期到期,但是卸载、appdata文件夹删除、注册表删掉之后,再重新打开解压版的Teamviewer,还是提示试用期到期,怎么破?
- python3抓取aqi
- Android事件分发机制
- java给文件内容添加头
- Android 解决WebView重定向