Java类锁

来源:互联网 发布:淘宝卖家信誉等级 编辑:程序博客网 时间:2024/06/07 15:48

/**
* 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;}@Overridepublic 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;}@Overridepublic 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,但不影响结论