Java中的同步块

同步块可以用于在方法的特定资源上执行同步。

假设我们的方法有50行代码,但我们只想在其中的5行进行同步,这种情况下我们可以使用同步块。 如果我们将方法的所有代码都放在同步块中,它的工作方式与同步方法相同。

要记住的要点

  • 同步块用于为任何共享资源锁定一个对象。
  • 同步块的作用域小于方法。
  • Java的同步块不允许多个JVM访问共享资源,以提供访问控制。
  • 由于synchronized关键字的工作速度较慢,系统性能可能会下降。
  • Java的同步块比Java的同步方法更高效。

语法

synchronized (object reference expression) {     
  //代码块   
}    

同步块的简单示例

TestSynchronizedBlock1.java

class Table  
{      
 void printTable(int n){    
   synchronized(this){//同步块
     for(int i=1;i<=5;i++){    
      System.out.println(n*i);    
      try{    
       Thread.sleep(400);    
      }catch(Exception e){System.out.println(e);}    
     }    
   }    
 }//方法结束    
}    
    
class MyThread1 extends Thread{    
Table t;    
MyThread1(Table t){    
this.t=t;    
}    
public void run(){    
t.printTable(5);    
}    
    
}    
class MyThread2 extends Thread{    
Table t;    
MyThread2(Table t){    
this.t=t;    
}    
public void run(){    
t.printTable(100);    
}    
}    
    
public class TestSynchronizedBlock1{    
public static void main(String args[]){    
Table obj = new Table();//只有一个对象   
MyThread1 t1=new MyThread1(obj);    
MyThread2 t2=new MyThread2(obj);    
t1.start();    
t2.start();    
}    
}    

输出:

       5
       10
       15
       20
       25
       100
       200
       300
       400
       500

使用匿名类的同步块示例

TestSynchronizedBlock2.java

// 发送者类   
class Sender   
{   
  public void SenderMsg(String msg)  
  {   
    System.out.println("\nSending a Message: "  + msg);  
    try  
    {   
      Thread.sleep(800);   
    }   
    catch (Exception e)   
    {   
      System.out.println("Thread interrupted.");   
    }   
    System.out.println("\n" +msg+ "Sent");  
  }  
}   
// 用于使用线程发送消息的 Sender 类    
class SenderWThreads extends Thread   
{   
  private String msg;   
  Sender sd;   
  
  //  Receiver 方法接收消息对象和要发送的消息   
  SenderWThreads(String m, Sender obj)  
  {   
    msg = m;  
    sd = obj;   
  }   
  
  public void run()   
  {   
    // 检查一次是否只有一个线程发送消息
    synchronized(sd)   
    {   
      // 同步发送者对象      
      sd.SenderMsg(msg);  
    }   
  }   
}   
// 驱动程序代码     
public class ShynchronizedMultithreading  
{   
  public static void main(String args[])   
  {   
    Sender sender = new Sender();   
    SenderWThreads sender1 = new SenderWThreads( "Hola " , sender);  
SenderWThreads sender2 =  new SenderWThreads( "Welcome to Javatpoint website ", sender);  
  
    //启动两个SenderWThreads类型的线程     
    sender1.start();   
    sender2.start();   
  
    // 等待线程结束   
    try  
    {   
      sender1.join();   
      sender2.join();   
    }   
    catch(Exception e)   
    {   
      System.out.println("Interrupted");   
    }   
  }   
}  

输出:

Sending a Message: Hola 
Hola Sent
Sending a Message: Welcome to Javatpoint website 
Welcome to Javatpoint website Sent

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想