黑马程序员技术交流社区
标题:
多线程死锁情况
[打印本页]
作者:
庄生晓梦
时间:
2012-12-5 16:56
标题:
多线程死锁情况
class Test2 implements Runnable
{
private boolean flag;
Test2(boolean flag)
{
this.flag = flag;
}
public void run()
{
if(flag)
{
while(true)
{
synchronized(MyLock.locka)
{
System.out.println("if locka");
synchronized(MyLock.lockb)
{
System.out.println("if lockb");
}
}
}
}
else
{
while(true)
{
synchronized(MyLock.lockb)
{
System.out.println("else lockb");
synchronized(MyLock.locka)
{
System.out.println("else locka");
}
}
}
}
}
}
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}
public class DeadLock {
public static void main(String[] args)
{
Thread t1 = new Thread(new Test2(true));
Thread t2 = new Thread(new Test2(false));
t1.start();
t2.start();
}
}
除类中定义MyLock类,如何使用对象级别实现死锁???????求代码
作者:
黄嵘才
时间:
2012-12-5 17:07
我看到有个总结好简单的,看这下。
synchronized(a){
...//1
synchronized(b){
}
}
synchronized(b){
...//2
synchronized(a){
}
}
复制代码
作者:
黄嵘才
时间:
2012-12-5 17:12
你可以试试这个;我只是是定义了两个String对象,对他们用锁也可死锁。其他的没有试过。
/*
* 线程死锁的测试
* 需求:写出一个会造成死锁的多线程。
* 方案:当线程1锁定了resource1时,再去试图锁定resource2.(此时,线程2可能锁定了resource2)
* 当线程2锁定了resource2时,再去试图锁定resource1.(此时,线程1可能锁定了resource1)
* 1两个线程类。继承Runnable接口。
* 2构造函数,接收两个资源:resource1 处resource2
* 3并实现其run方法。并且方法内执行对两个资源同步锁:synchronized
* 4为体现效果,让线程休眠若干秒。
*/
class TestDeadThread {
public static void main(String[] args) {
String resource1 = "resource1";
String resource2 = "resource2";
Thread thread1 = new Thread(new Thread1(resource1, resource2));
Thread thread2 = new Thread(new Thread2(resource1, resource2));
thread1.start();
thread2.start();
}
}
/*
* 线程1
*/
class Thread1 implements Runnable {
String resource1;
String resource2;
Thread1(String r1, String r2) {
resource1 = r1;
resource2 = r2;
}
@Override
public void run() {
//
synchronized (resource1) {
System.out.println("1锁住resource1===");
synchronized (resource2) {//锁定resource1的同时,试图要锁定resource2
while(true){
System.out.println("1锁住resource2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
/*
* 线程2
*/
class Thread2 implements Runnable {
String resource1;
String resource2;
Thread2(String r1, String r2) {
resource1 = r1;
resource2 = r2;
}
@Override
public void run() {
//
synchronized (resource2) {
System.out.println("2锁住resource2");
synchronized (resource1) {//锁定resource2的同时,试图要锁定resource1
System.out.println("2锁住resource1===");
}
}
}
}
复制代码
作者:
庄生晓梦
时间:
2012-12-10 17:06
多谢了!
作者:
臧盼
时间:
2012-12-10 20:45
class A extends Thread
{
public void run(){
synchronized(A.class){
try{Thread.sleep(10);}catch(Exception e){}
synchronized(B.class){
}
}
}
}
class B extends Thread
{
public void run(){
synchronized(B.class){
try{Thread.sleep(10);}catch(Exception e){}
synchronized(A.class){
}
}
}
}
public class ThreadDemo
{
public static void main(String[] args){
A a = new A() ;
B b = new B() ;
a.start() ;
b.start() ;
}
}
这是一个最简单死锁,其实编写死锁代码只会出现在面试中,没有哪个程序员会在项目中故意写个死锁,那是自找麻烦,所以以后我们应该避免死锁,死锁只需要理解原理就行。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2