Java同步方法_极悦注册
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java同步方法

Java同步方法

更新时间:2022-06-15 10:36:22 来源:极悦 浏览839次

Java中的同步是控制多个线程对任何共享资源的访问的能力。

在我们希望只允许一个线程访问共享资源的情况下,Java 同步是更好的选择。

为什么要使用同步?

同步主要用于

防止线程干扰。

防止一致性问题。

同步类型

有两种类型的同步

进程同步

线程同步

在这里,我们将只讨论线程同步。

线程同步

线程同步有互斥和线程间通信两种。

1.互斥

同步方法。

同步块。

静态同步。

2.协作(java中的线程间通信)

互斥

互斥有助于防止线程在共享数据时相互干扰。可以通过以下三种方式实现:

1.通过使用同步方法

2.通过使用同步块

3.通过使用静态同步

Java中锁的概念

同步是围绕称为锁或监视器的内部实体构建的。每个对象都有一个与之关联的锁。按照惯例,需要对对象字段进行一致访问的线程必须在访问对象之前获取对象的锁,然后在完成访问时释放锁。

从 Java 5 开始,包 java.util.concurrent.locks 包含多个锁实现。

在没有同步的情况下理解问题

在这个例子中,没有同步,所以输出不一致。让我们看看这个例子:

TestSynchronization1.java

class Table{  
void printTable(int n){//method not synchronized  
   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);  
}  
}   
class TestSynchronization1{  
public static void main(String args[]){  
Table obj = new Table();//only one object  
MyThread1 t1=new MyThread1(obj);  
MyThread2 t2=new MyThread2(obj);  
t1.start();  
t2.start();  
}  
}  

输出:

       5
       100
       10
       200
       15
       300
       20
       400
       25
       500

Java同步方法

如果您将任何方法声明为同步,则称为同步方法。

同步方法用于为任何共享资源锁定对象。

当线程调用同步方法时,它会自动获取该对象的锁,并在线程完成其任务时释放它。

TestSynchronization2.java

//example of java synchronized method  
class Table{  
 synchronized void printTable(int n){//synchronized method  
   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 TestSynchronization2{  
public static void main(String args[]){  
Table obj = new Table();//only one object  
MyThread1 t1=new MyThread1(obj);  
MyThread2 t2=new MyThread2(obj);  
t1.start();  
t2.start();  
}  
}  

输出:

       5 
       10 
       15 
       20 
       25 
       100 
       200 
       300 
       400 
       500

使用匿名类的同步方法示例

在这个程序中,我们使用匿名类创建了两个线程,因此需要较少的编码。

TestSynchronization3.java

//Program of synchronized method by using annonymous class  
class Table{  
 synchronized void printTable(int n){//synchronized method  
   for(int i=1;i<=5;i++){  
     System.out.println(n*i);  
     try{  
      Thread.sleep(400);  
     }catch(Exception e){System.out.println(e);}  
   }  
  
 }  
}    
public class TestSynchronization3{  
public static void main(String args[]){  
final Table obj = new Table();//only one object    
Thread t1=new Thread(){  
public void run(){  
obj.printTable(5);  
}  
};  
Thread t2=new Thread(){  
public void run(){  
obj.printTable(100);  
}  
};    
t1.start();  
t2.start();  
}  
}  

输出:

       5
       10
       15
       20
       25
       100
       200
       300
       400
       500

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>