-
繼承 Thread
class Thr extends Thread {
-
實現 runnable介面
class TT implements Runnable {
-
執行執行緒
public static void main(String[] args) {
new Thr().start();
new Thread(new TT(),"thread").start();
}
synchronized 的使用
理解synchronized 的加鎖原理.
package concurrent01.c000;
public class T {
private Integer count = 10;
public void run() {
for (int i = 0; i < 10; i++) {
count --;
System.out.println(Thread.currentThread().getName() +"thread name is"+count);
}
}
}
多個執行緒執行run()方法的時候,確保count的值每次只被一個執行緒修改.有四種方式
-
使用volatile關鍵字修飾
private volatile static Integer count = 10;
-
使用synchronized關鍵字,給程式碼上鎖
package concurrent01.c000;
public class T {
private Integer count = 10;
private Object o = new Object();
public void t1() {
synchronized(o){
for (int i = 0; i < 10; i++) {
count --;
System.out.println(Thread.currentThread().getName() +"thread name is"+count);
}
}
}
} -
可以將o替代成this.
public void t1() {
synchronized(this){
for (int i = 0; i < 10; i++) {
count --;
System.out.println(Thread.currentThread().getName() +"thread name is"+count);
}
} -
也可以在方法上面加鎖,這種方法和第三鍾方式完全等效,程式碼在執行的時候,可以看成是一種方式
package concurrent01.c000;
public class T {
private volatile Integer count = 10;
public synchronized void t1() {
for (int i = 0; i < 10; i++) {
count --;
System.out.println(Thread.currentThread().getName() +"thread name is"+count);
}
}
}synchronized 在執行一段程式碼的時候,需要給一個物件加鎖.
執行過程
執行緒執行程式碼塊,發現synchronized,查詢鎖物件
鎖物件頭空間有一個markdown標識,如果是00,說明這段程式碼還沒有加鎖,執行緒拿到程式碼的執行權,並給鎖物件markdown標識設定為01,加鎖.
其他執行緒執行到這裡的時候,去檢視鎖物件的標識,發現是01,說明這段程式碼已經加鎖,進入等待狀態.
拿到鎖的執行緒,執行完成之後,將鎖物件的標識設定為00,即解鎖