java的同步(附代码示例)

Java 中的同步是一种 Java 特性,它限制多个线程同时尝试访问共同共享的资源。这里的共享资源是指外部文件内容、类变量或数据库记录。

同步在多线程编程中被广泛使用。“同步”是一个关键字,它为您的代码提供了在此期间只允许单个线程对其进行操作而不受任何其他线程干扰的能力。

为什么我们需要 Java 中的同步?

  • Java 是一种多线程编程语言。这意味着两个或多个线程可以同时运行以完成一项任务。当线程同时运行时,很可能会发生代码可能会提供意外结果的情况。
  • 您可能想知道,如果多线程会导致错误的输出,那么为什么它被认为是 Java 中的一个重要特性呢?
  • 多线程通过并行运行多个线程,减少代码执行时间并提供高性能,使您的代码更快。但是,由于通常称为竞争条件的条件,使用多线程环境会导致输出不准确。

什么是竞态条件?

当两个或多个线程并行运行时,它们往往会在那个时间点访问和修改共享资源。线程调度算法决定线程执行的顺序。

因此,由于线程调度程序单独控制线程,因此无法预测线程的执行顺序。这会影响代码的输出并导致输出不一致。由于多个线程相互竞争以完成操作,因此该条件称为“竞争条件”。

例如,让我们考虑以下代码:

Class Modify:
package JavaConcepts;
public class Modify implements Runnable{
private int myVar=0;
public int getMyVar() {
return myVar;
}
public void setMyVar(int myVar) {
this.myVar = myVar;
}
public void increment() {
myVar++;
}
@Override
public void run() {
// TODO Auto-generated method stub
this.increment();
System.out.println("Current thread being executed "+ Thread.currentThread().getName() + "Current Thread value " + this.getMyVar());
}
}
Class RaceCondition:
package JavaConcepts;
public class RaceCondition {
public static void main(String[] args) {
Modify mObj = new Modify();
Thread t1 = new Thread(mObj, "thread 1");
Thread t2 = new Thread(mObj, "thread 2");
Thread t3 = new Thread(mObj, "thread 3");
t1.start();
t2.start();
t3.start();
}
}

连续运行上述代码,输出如下:

输出1:

当前正在执行的线程 thread 1 Current Thread value 3

当前正在执行的线程 thread 3 Current Thread value 2

当前正在执行的线程 thread 2 Current Thread value 3

输出2:

当前正在执行的线程 thread 3 Current Thread value 3

当前正在执行的线程 thread 2 Current Thread value 3

当前正在执行的线程 thread 1 Current Thread value 3

输出3:

当前正在执行的线程 thread 2 Current Thread value 3

当前正在执行的线程 thread 1 Current Thread value 3

当前正在执行的线程 thread 3 Current Thread value 3

输出4:

当前正在执行的线程 thread 1 Current Thread value 2

当前正在执行的线程 thread 3 Current Thread value 3

当前正在执行的线程 thread 2 Current Thread value 2

  • 从上面的示例中,您可以得出结论,线程是随机执行的,并且值不正确。按照我们的逻辑,该值应该增加 1。但是,这里的输出值在大多数情况下是 3,在少数情况下是 2。
  • 这里的“myVar”变量是多个线程正在执行的共享资源。线程同时访问和修改“myVar”的值。让我们看看如果我们注释掉另外两个线程会发生什么。

这种情况下的输出是:

当前正在执行的线程 thread 1 Current Thread value 1

这意味着当单个线程运行时,输出符合预期。但是,当多个线程正在运行时,每个线程都在修改该值。因此,需要一次将处理共享资源的线程数限制为单个线程。这是使用同步来实现的。

java的同步(附代码示例)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注