java線程同步方法,方法塊區別,java線程同步區別
先說同步方法,它到底是鎖定的當前對象,還是當前類
代碼塊1
package com.ssss;public class Thread1 implements Runnable { //public static Object o=new Object(); public void run() { pt(); } public synchronized void pt(){ int a=0; //synchronized(o) { for (int i = 0; i < 5; i++) { a++; try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} System.out.println(Thread.currentThread().getName() + " synchronized loop " + i + "++++" + a); } //} } public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread1 t2 = new Thread1(); Thread ta = new Thread(t1, "A"); Thread tb = new Thread(t2, "B"); ta.start(); tb.start(); } }
列印出來的結果為
由此可見是當前對象,而A和B是兩個不同的對象,所以列印序列就是混亂的
代碼塊2
看同步塊
package com.ssss;public class Thread1 implements Runnable { public static Object o=new Object(); public void run() { pt(); } public void pt(){ int a=0; synchronized(o) { for (int i = 0; i < 5; i++) { a++; try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} System.out.println(Thread.currentThread().getName() + " synchronized loop " + i + "++++" + a); } } } public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread1 t2 = new Thread1(); Thread ta = new Thread(t1, "A"); Thread tb = new Thread(t2, "B"); ta.start(); tb.start(); } }
看列印序列
說明同步塊可以鎖定任何對象
就是說同步方法是鎖定當前對象,同步方法塊是可以鎖定任何對象