synchronized首先明确锁的是对象而不是方法代码,如果一个对象有两个方法,两个线程分别调用其中一个方法,如果锁传入的参数为 同一对象与不同对象,线程运行结果是不一样的
死锁代码如下
package com.hanshow.wise.portal.center.controller.common;
public class Test11 {
public static void main(String[] args) {
Person person = new Person();
MyThreadAA a = new MyThreadAA(person);
MyThreadAA b = new MyThreadAA(person);
new Thread(a, "张三").start();
new Thread(b, "李四").start();
}
}
class MyThreadAA implements Runnable{
public Person person;
public static Person p1 = new Person();
public static Person p2 = new Person();
MyThreadAA (Person person) {
this.person = person;
}
@Override
public void run() {
String str = Thread.currentThread().getName();
if (str.equals(person.name1)) {
synchronized (p1) {
try {
person.eat();
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
synchronized (p2) {
person.sleep();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
synchronized (p2) {
try {
person.sleep();
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
synchronized (p1) {
person.eat();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class Person {
public String name1 = "张三";
public String name2 = "李四";
public void eat() {
System.out.println("吃饭饭");
}
public void sleep() {
System.out.println("睡觉觉");
}
}