# 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 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 SentSending a Message: Welcome to Javatpoint website Welcome to Javatpoint website Sent
领取专属 10元无门槛券
私享最新 技术干货