你可以试试这个;我只是是定义了两个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===");
- }
- }
- }
- }
复制代码 |