synchronized關鍵字可以用于聲明方法,也可以用于聲明代碼塊;
package com.test.java;
public class SyncTest {
public static void main(String[] args) {
SynchronizedDemo1 synct1 = new SynchronizedDemo1();
SynchronizedDemo2 synct = new SynchronizedDemo2();
SynchronizedDemo2 synct2 = new SynchronizedDemo2();
Thread t = new Thread(){
@Override
public void run() {
SynchronizedDemo1.foo1();
}
};
Thread t2 = new Thread(){
@Override
public void run() {
synct1.foo2();
}
};
t.start();
t2.start();
System.out.println("-------------");
}
}
/**
* 靜態方法修飾, 全局阻塞(調用方法則阻塞)
* 在不同線程中,這個兩個方法調用時互斥的
* @author 63176
*/
class SynchronizedDemo1{
public synchronized static void foo1(){
System.out.println("foo1被執行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未執行結束");
}
public synchronized static void foo2(){
System.out.println("foo2被執行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2執行結束");
}
}
/**
* 同一對象方法調用阻塞測試
* 針對同一個對象的多線程方法調用互斥
* @author 63176
*
*/
class SynchronizedDemo2{
public synchronized void foo1(){
System.out.println("foo1被執行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未執行結束");
}
public synchronized void foo2(){
System.out.println("foo2被執行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2執行結束");
}
}
/**
* 塊阻塞 -
*
* @author 63176
* synchronized this時,僅鎖定當前對象引用;
* synchronized 類時,鎖定類,與靜態方法是互斥的
*/
class SynchronizedDemo3{
public void foo1(){
synchronized (this) {
System.out.println("foo1被執行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未執行結束");
}
}
public void foo2(){
synchronized (SynchronizedDemo3.class) {
System.out.println("foo2被執行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2執行結束");
}
}
}
當線程進入第一個方法時,方法處理中,則其余線程訪問對應其他方法時,需等待第一個完成;