文件名:DeadThreadByExtend.java
注:
1搀愧、起線程的時候用的是start方法少态,run方法也可以調(diào)用城侧,但是僅僅相當于普通調(diào)用,在當前線程內(nèi)執(zhí)行况增。
2赞庶、synchronized 不能直接修飾變量训挡。
3澳骤、synchronized 塊并不會強制塊內(nèi)變量的單線程訪問。僅僅意味著在執(zhí)行塊內(nèi)語句時鎖住synchronized (args)的參數(shù)澜薄,直到執(zhí)行結(jié)束才釋放为肮。
package com.ycf.study.thread;
class Sources{
int a;
public void setA(int x) {
synchronized (this) {
this.a = x;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class DeadThreadByExtend {
public static void main(String[] args) {
Sources s1 = new Sources();
Sources s2 = new Sources();
class MyThread1 extends java.lang.Thread {
@Override
public void run() {
System.out.println("線程1開始");
synchronized (s1) {
System.out.println("線程1申請修改s1");
s1.setA(20);
System.out.println("線程1修改完成");
System.out.println("線程1申請修改s2");
s2.setA(10);
System.out.println("線程1修改s2完成");
}
System.out.println("線程1退出并釋放鎖++++++++++");
}
}
class MyThread2 extends java.lang.Thread {
@Override
public void run() {
System.out.println("線程2開始");
synchronized (s2) {
System.out.println("線程2申請修改s2");
s2.setA(20);
System.out.println("線程2修改s2完成");
System.out.println("線程2申請修改s1");
s1.setA(10);
System.out.println("線程2修改s1完成");
}
System.out.println("線程2退出并釋放鎖++++++++++");
}
}
MyThread1 mt1 = new MyThread1();
MyThread2 mt2 = new MyThread2();
mt1.start();
mt2.start();
}
}