1. 程式人生 > >java執行緒---同步方法

java執行緒---同步方法

關鍵字synchronized方法方法上修飾,那麼該方法就是同步方法。

同步方法分為 :非靜態同步方法和靜態同步方法。

程式碼如下:

非靜態同步方法

package sx.test.thread;
public class Demo4 {
public static void main(String[] args) {
final Print2 p = new Print2();
//匿名內部類
new Thread("執行緒1---"){
public void run() {
for(int i=0;i<20;i++){
p.print1();
}
}
}.start();
//匿名內部類
new Thread("執行緒2---"){
public void run() {
for(int i=0;i<20;i++){
p.print2();
}
}
}.start();
}
}
class Print2{
//無論是同步程式碼塊還是同步方法,他們必須要保證鎖物件是一致的。
Demo4 d = new Demo4();
public synchronized

void print1(){
System.out.print("床");
System.out.print("前");
System.out.print("明");
System.out.print("月");
System.out.print("光");
System.out.print("\r\n");
}
public void print2(){ 
synchronized(this){    //非靜態同步方法的鎖物件必須是this
System.out.print("疑");
System.out.print("似");
System.out.print("地");
System.out.print("上");
System.out.print("霜");
System.out.print("\r\n");
}
}
}

靜態同步方法

package sx.test.thread;
public class Demo5 {
public static void main(String[] args) {
final Print3 p = new Print3();
//匿名內部類
new Thread("執行緒1---"){
public void run() {
for(int i=0;i<20;i++){
p.print1();
}
}
}.start();
//匿名內部類
new Thread("執行緒2---"){
public void run() {
for(int i=0;i<20;i++){
p.print2();
}
}
}.start();


}
}
class Print3{
//無論是同步程式碼塊還是同步方法,他們必須要保證鎖物件是一致的。
Demo5 d = new Demo5();
public static synchronized void print1(){
System.out.print("床");
System.out.print("前");
System.out.print("明");
System.out.print("月");
System.out.print("光");
System.out.print("\r\n");
}
public static void print2(){
//靜態同步方法的鎖物件是類名.class
synchronized(Print3.class){    //靜態方法隨著類的載入而載入,而類的載入是有物件的,即類的位元組碼物件:類名.class
System.out.print("疑");
System.out.print("似");
System.out.print("地");
System.out.print("上");
System.out.print("霜");
System.out.print("\r\n");
}
}
}