一、
1、创建公共两个对象
2、创建两个线程
线程1先获得一个对象,睡眠等待 然后再获得另外一个对象
线程2也获得一个对象,睡眠等待 然后再获得另外一个对象
package Test;
/**
*/
public class MyThread {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
//创建线程1
new Thread(()->{
synchronized(o1){
System.out.println(Thread.currentThread().getName() + " i get o1");
try {
Thread.sleep(2000); //睡眠2秒 让线程二可以拿到另一个资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i wangt o2");
synchronized (o2){
System.out.println(Thread.currentThread().getName() + " i get o2");
}
}
}).start();
//创建线程2
new Thread(()->{
synchronized(o2){
System.out.println(Thread.currentThread().getName() + " i get o2");
try {
Thread.sleep(2000); //睡眠2秒 让线程二可以拿到另一个资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i wangt o1");
synchronized (o1){
System.out.println(Thread.currentThread().getName() + " i get o1");
}
}
}).start();
}
}
方式二、
package Test;
public class MyThread2 extends Thread{
//两个线程
public static Object o1 = new Object(), o2 = new Object();
int flage ;
@Override
public void run(){
if (flage == 1){ //如果是线程一
synchronized(o1){
System.out.println(Thread.currentThread().getName() + " i get o1");
try {
Thread.sleep(2000); //睡眠2秒 让线程二可以拿到另一个资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i wangt o2");
synchronized (o2){
System.out.println(Thread.currentThread().getName() + " i get o2");
}
}}
if (flage == 2){ //如果是线程二
synchronized(o2){
System.out.println(Thread.currentThread().getName() + " i get o2");
try {
Thread.sleep(2000); //睡眠2秒 让线程二可以拿到另一个资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i wangt o1");
synchronized (o1){
System.out.println(Thread.currentThread().getName() + " i get o1");
}
}
}
}
public static void main(String[] args) {
MyThread2 myThread1 = new MyThread2();
myThread1.flage=1;
MyThread2 myThread2 = new MyThread2();
myThread2.flage=2;
Thread t1 = new Thread(myThread1,"线程一");
t1.start();
Thread t2 = new Thread(myThread2,"线程二");
t2.start();
}
}
方式三、
package Test;
public class MyThread3 implements Runnable{
//两个线程
public static Object o1 = new Object(), o2 = new Object();
int flage ;
@Override
public void run(){
if (flage == 1){ //如果是线程一
synchronized(o1){
System.out.println(Thread.currentThread().getName() + " i get o1");
try {
Thread.sleep(2000); //睡眠2秒 让线程二可以拿到另一个资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i wangt o2");
synchronized (o2){
System.out.println(Thread.currentThread().getName() + " i get o2");
}
}}
if (flage == 2){ //如果是线程二
synchronized(o2){
System.out.println(Thread.currentThread().getName() + " i get o2");
try {
Thread.sleep(2000); //睡眠2秒 让线程二可以拿到另一个资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i wangt o1");
synchronized (o1){
System.out.println(Thread.currentThread().getName() + " i get o1");
}
}
}
}
public static void main(String[] args) {
MyThread3 myThread1 = new MyThread3();
myThread1.flage = 1;
MyThread3 myThread2 = new MyThread3();
myThread2.flage = 2;
new Thread(myThread1).start();
new Thread(myThread2).start();
}
}