【利用鎖的三種方法來實現在多個執行緒時只執行一個執行緒】
阿新 • • 發佈:2019-02-10
- package test.thread;
- public class TestSync {
- public static void main(String[] args) {
- Object object = new Object();
- for (int i = 0; i < 5; i++) {
- new Sync2(i, object).start();
- }
- }
- }
- //第一種方法:利用鎖住方法來做(其實就是為了保證方法的唯一性就可以了),,利用了static來實現
- class Sync3 extends Thread {
- //傳入執行緒編號
- public Sync3(int num) {
- // TODO Auto-generated constructor stub
- }
- @Override
- public void run() {
- print(getName());
- }
- //【關鍵】執行一個鎖住的方法,然後將其放在run方法裡面執行,保證了鎖住執行緒
- public synchronized static void print(String name)
- {
- for (int i = 0; i < 1000; i++) {
- System.out.println("編號為"+name+"列印"+i);
- }
- }
- }
- //第二種方法:利用鎖住物件來做,其實就是為了鎖住同一個物件就可以了需要在主類中新建一個物件,來保證每次呼叫時物件都是唯一的
- class Sync2 extends Thread {
- // 不管new多少個最終只有一個物件,
- // static Object object = new Object();
- private Object object = new Object();
- public Sync2(int num, Object object) {
- super(String.valueOf(num));
- this.object = object;
- }
- public void run() {
- synchronized (object) {
- for (int i = 0; i < 1000; i++) {
- System.out.println("執行緒為" + getName() + " " + i);
- }
- }
- }
- }
- //第三種方法:利用鎖住物件來做,其實就是為了鎖住同一個物件就可以了,,利用了static來實現
- class Sync extends Thread {
- // 不管new多少個最終只有一個物件,
- static Object object = new Object();
- public Sync(int num) {
- super(String.valueOf(num));
- }
- public void run() {
- synchronized (object) {
- for (int i = 0; i < 1000; i++) {
- System.out.println("執行緒為" + getName() + " " + i);
- }
- }
- }
- }