📜  Java同步-静态同步示例

📅  最后修改于: 2020-09-27 01:36:50             🧑  作者: Mango

静态同步

如果将任何静态方法设置为已同步,则锁定将锁定在类上而不是对象上。

没有静态同步的问题

假设有两个共享类(例如表)的对象,分别称为对象1和对象2。在使用同步方法和同步块的情况下,t1和t2或t3和t4之间不会存在干扰,因为t1和t2都引用了一个具有单个锁,但是t1和t3或t2和t4之间可能会有干扰,因为t1获得了另一个锁,t3获得了另一个锁,我希望t1和t3或t2和t4之间没有干扰,静态同步解决了这个问题。

静态同步示例

在此示例中,我们将static关键字应用于static方法以执行静态同步。


class Table{

 synchronized static void printTable(int n){
   for(int i=1;i<=10;i++){
     System.out.println(n*i);
     try{
       Thread.sleep(400);
     }catch(Exception e){}
   }
 }
}

class MyThread1 extends Thread{
public void run(){
Table.printTable(1);
}
}

class MyThread2 extends Thread{
public void run(){
Table.printTable(10);
}
}

class MyThread3 extends Thread{
public void run(){
Table.printTable(100);
}
}




class MyThread4 extends Thread{
public void run(){
Table.printTable(1000);
}
}

public class TestSynchronization4{
public static void main(String t[]){
MyThread1 t1=new MyThread1();
MyThread2 t2=new MyThread2();
MyThread3 t3=new MyThread3();
MyThread4 t4=new MyThread4();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
Output: 1
       2
       3
       4
       5
       6
       7
       8
       9
       10
       10       
       20
       30
       40
       50
       60
       70
       80
       90
       100
       100
       200
       300
       400
       500
       600
       700
       800
       900
       1000
       1000
       2000
       3000
       4000
       5000
       6000
       7000
       8000
       9000
       10000
       

匿名类的静态同步的相同示例

在此示例中,我们使用匿名类创建线程。


class Table{

 synchronized static  void printTable(int n){
   for(int i=1;i<=10;i++){
     System.out.println(n*i);
     try{
       Thread.sleep(400);
     }catch(Exception e){}
   }
 }
}

public class TestSynchronization5 {
public static void main(String[] args) {

Thread t1=new Thread(){
public void run(){
Table.printTable(1);
}
};

Thread t2=new Thread(){
public void run(){
Table.printTable(10);
}
};

Thread t3=new Thread(){
public void run(){
Table.printTable(100);
}
};

Thread t4=new Thread(){
public void run(){
Table.printTable(1000);
}
};
t1.start();
t2.start();
t3.start();
t4.start();

}
}

Output: 1
       2
       3
       4
       5
       6
       7
       8
       9
       10
       10       
       20
       30
       40
       50
       60
       70
       80
       90
       100
       100
       200
       300
       400
       500
       600
       700
       800
       900
       1000
       1000
       2000
       3000
       4000
       5000
       6000
       7000
       8000
       9000
       10000
       

类锁上的同步块:

该块在由参考.class名称.class表示的对象的锁上同步。类Table中的静态同步方法printTable(int n)等效于以下声明:

static void printTable(int n) {
    synchronized (Table.class) {       // Synchronized block on class A
        // ...
    }
}