更新时间:2022-06-15 10:36:22 来源:极悦 浏览839次
Java中的同步是控制多个线程对任何共享资源的访问的能力。
在我们希望只允许一个线程访问共享资源的情况下,Java 同步是更好的选择。
同步主要用于
防止线程干扰。
防止一致性问题。
有两种类型的同步
进程同步
线程同步
在这里,我们将只讨论线程同步。
线程同步有互斥和线程间通信两种。
1.互斥
同步方法。
同步块。
静态同步。
2.协作(java中的线程间通信)
互斥有助于防止线程在共享数据时相互干扰。可以通过以下三种方式实现:
1.通过使用同步方法
2.通过使用同步块
3.通过使用静态同步
同步是围绕称为锁或监视器的内部实体构建的。每个对象都有一个与之关联的锁。按照惯例,需要对对象字段进行一致访问的线程必须在访问对象之前获取对象的锁,然后在完成访问时释放锁。
从 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
如果您将任何方法声明为同步,则称为同步方法。
同步方法用于为任何共享资源锁定对象。
当线程调用同步方法时,它会自动获取该对象的锁,并在线程完成其任务时释放它。
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
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习