Java教程-Java中的同步块

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