/**
* Created by 风凌渡口 on 2017/6/21.
*/
public class TestThread {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "杨过";
Person p2 = new Person();
p2.name = "小龙女";
Thread t1 = new MyThread1(p1);
t1.setName("杨过线程");
t1.start();
Thread t2 = new MyThread2(p2);
t2.setName("小龙女线程");
t2.start();
}
}
class MyThread1 extends Thread{
private Person person;
public MyThread1(Person person) {
this.person = person;
}
@Override
public void run() {
System.out.println("111111111111111");
person.setAge(22);
System.out.println("??????????????????????????");
System.out.println(Thread.currentThread().getName() + person.name + person.getAge() + person.getLanguage());
System.out.println("555555555555555");
}
}
class MyThread2 extends Thread{
private Person person;
public MyThread2(Person person) {
this.person = person;
}
@Override
public void run() {
System.out.println("222222222222222222");
person.age = 23;
person.setLanguage("C++");
System.out.println(Thread.currentThread().getName() + person.name + person.getLanguage());
System.out.println("3333333333333333333333333333");
}
}
/**
* Created by 风凌渡口 on 2017/5/19.
*/
public class Person {
public String name;
public static int age;
public static String language;
public Person() {
}
synchronized static int getAge() {
return age;
}
synchronized static void setAge(int age) {
System.out.println("设置年龄时间" + System.currentTimeMillis());
Person.age = age;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized static String getLanguage() {
System.out.println("获取语言时间" + System.currentTimeMillis());
return language;
}
static void setLanguage(String language) {
Person.language = language;
}
}
控制台打印:
222222222222222222
获取语言时间1498016105993
小龙女线程小龙女C++
3333333333333333333333333333
111111111111111
设置年龄时间1498016105993
??????????????????????????
获取语言时间1498016110994
杨过线程杨过22C++
555555555555555
结论:
在设置年龄之后5秒钟才可以获取语言
原因:
年龄和语言都是类成员,设置年龄时Class对象被锁定,线程休眠,不释放锁,因此,不能获取语言,5秒后,锁被释放,获取语言,
注:
控制台显示先启动线程2,也有情况先启动线程1,但不影响结论