/*不知道大家有没有发现,这个题目,s1,s2既可以定义在main函数内(局部变量),也可以在main函数外(成员变量)
但是其修饰关键字不一样,作为局部变量时:final关键字修饰
作为成员变量时:static关键字修饰.
个人总结了下:1.S1,S2放在main函数内,作为局部变量使用,因为S1,S2是被建立的匿名类对象调用,而局部变量的身份使其生命周期较短,需要用final修饰放到常量池延长生命周期.2.S1,S2放在main函数外,作为成员变量使用,因为main函数是被static修饰的,所以其需要被static修饰(静态方法只能调用静态方法,静态成员)
*/
public class LockDead {
static String s1 ="筷子左";//main函数为静态,只能访问静态成员,须用static修饰
static String s2 ="筷子右";
public static void main(String[] args) {
//final String s1 ="筷子左";//需要被final修饰,被匿名类调用,延长生命周期.
//final String s2 ="筷子右";
new Thread(){
public void run(){
while(true){
synchronized (s1) {
System.out.println("获取"+s1+"等待"+s2);
synchronized (s2) {
System.out.println(s1+s2+"都有了,开始吃饭");
}
}
}
}
}.start();
new Thread(){
public void run(){
while(true){
synchronized (s2) {
System.out.println("获取"+s2+"等待"+s1);
synchronized (s1) {
System.out.println(s1+s2+"都有了,开始吃饭");
}
}
}
}
}.start();
}
}
|