public class Main {
public static void main
( String [ ] args
) { // These are the two resources R1 and R2 Thread thr1 and thr2 try to get locks for
final Object R1
= "Resource1" ; final Object R2
= "Resource2" ; // Here's the first thread. It tries to lock R1 then R2
public void run( ) {
// Lock resource 1
synchronized ( R1) {
System .
out .
println ( "Thread 1: Acquired and Locked resource 1" ) ;
//Force deadlock by sleeping for sometime so that thread2 can come and
//acquire lock for R2
System .
out .
println ( "Thread 1: Trying to acquire lock on R2" ) ; // Now wait 'till we can get a lock on resource 2
synchronized ( R2) {
System .
out .
println ( "Thread 1: Acquired and Locked resource 2" ) ; }
}
}
} ;
// Here's the second thread. It tries to lock resource2 then resource1
public void run( ) {
// This thread locks resource 2 right away
synchronized ( R2) {
System .
out .
println ( "Thread 2: Acquired and Locked resource 2" ) ;
// Then it pauses, for the same reason as the first thread does
System .
out .
println ( "Thread 2: Trying to acquire lock on R1" ) ;
synchronized ( R1) {
System .
out .
println ( "Thread 2: Acquired and Locked resource 1" ) ; }
}
}
} ;
// Start the two threads. If all goes as planned, deadlock will occur,
// and the program will never exit.
thr1.start ( ) ;
thr2.start ( ) ;
}
}
CgoKcHVibGljIGNsYXNzIE1haW4gewogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgIC8vIFRoZXNlIGFyZSB0aGUgdHdvIHJlc291cmNlcyBSMSBhbmQgUjIgVGhyZWFkIHRocjEgYW5kIHRocjIgdHJ5IHRvIGdldCBsb2NrcyBmb3IKICAgIGZpbmFsIE9iamVjdCBSMSA9ICJSZXNvdXJjZTEiOwogICAgZmluYWwgT2JqZWN0IFIyID0gIlJlc291cmNlMiI7CiAgICAvLyBIZXJlJ3MgdGhlIGZpcnN0IHRocmVhZC4gIEl0IHRyaWVzIHRvIGxvY2sgUjEgdGhlbiBSMgogICAgVGhyZWFkIHRocjEgPSBuZXcgVGhyZWFkKCkgewogICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgLy8gTG9jayByZXNvdXJjZSAxCiAgICAgICAgc3luY2hyb25pemVkKFIxKSB7CiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVhZCAxOiBBY3F1aXJlZCBhbmQgTG9ja2VkIHJlc291cmNlIDEiKTsKCiAgICAgICAgICAvL0ZvcmNlIGRlYWRsb2NrIGJ5IHNsZWVwaW5nIGZvciBzb21ldGltZSBzbyB0aGF0IHRocmVhZDIgY2FuIGNvbWUgYW5kCiAgICAgICAgICAvL2FjcXVpcmUgbG9jayBmb3IgUjIKICAgICAgICAgIHRyeSB7IFRocmVhZC5zbGVlcCgxMDApOyB9IAogICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVhZCAxOiBUcnlpbmcgdG8gYWNxdWlyZSBsb2NrIG9uIFIyIik7ICAgICAgICAgIAogICAgICAgICAgLy8gTm93IHdhaXQgJ3RpbGwgd2UgY2FuIGdldCBhIGxvY2sgb24gcmVzb3VyY2UgMgogICAgICAgICAgc3luY2hyb25pemVkKFIyKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkIDE6IEFjcXVpcmVkIGFuZCBMb2NrZWQgcmVzb3VyY2UgMiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIAogICAgLy8gSGVyZSdzIHRoZSBzZWNvbmQgdGhyZWFkLiAgSXQgdHJpZXMgdG8gbG9jayByZXNvdXJjZTIgdGhlbiByZXNvdXJjZTEKICAgIFRocmVhZCB0aHIyID0gbmV3IFRocmVhZCgpIHsKICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgIC8vIFRoaXMgdGhyZWFkIGxvY2tzIHJlc291cmNlIDIgcmlnaHQgYXdheQogICAgICAgIHN5bmNocm9uaXplZChSMikgewogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJlYWQgMjogQWNxdWlyZWQgYW5kIExvY2tlZCByZXNvdXJjZSAyIik7CgogICAgICAgICAgLy8gVGhlbiBpdCBwYXVzZXMsIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIGZpcnN0IHRocmVhZCBkb2VzCiAgICAgICAgICB0cnkgeyBUaHJlYWQuc2xlZXAoMTAwKTsgfSAKICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQoKICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkIDI6IFRyeWluZyB0byBhY3F1aXJlIGxvY2sgb24gUjEiKTsgICAgICAgICAgCiAgICAgICAgICAKICAgICAgICAgIHN5bmNocm9uaXplZChSMSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmVhZCAyOiBBY3F1aXJlZCBhbmQgTG9ja2VkIHJlc291cmNlIDEiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIFN0YXJ0IHRoZSB0d28gdGhyZWFkcy4gSWYgYWxsIGdvZXMgYXMgcGxhbm5lZCwgZGVhZGxvY2sgd2lsbCBvY2N1ciwgCiAgICAvLyBhbmQgdGhlIHByb2dyYW0gd2lsbCBuZXZlciBleGl0LgogICAgdGhyMS5zdGFydCgpOyAKICAgIHRocjIuc3RhcnQoKTsKICB9Cn0=