同步是一种在尝试访问共享资源的多个线程之间建立合作的方式。它对于可靠的线程交互是必要的,并且使用"synchronized"关键字来完成。
在本文中,我们将学习静态同步以及它们如何管理线程,以便它们能够高效工作。
多线程
它是 Java 编程语言的一项功能,使我们能够同时执行多个操作。其中,操作被分为多个较小的部分,称为线程。每个线程执行一项独立的任务,而不影响其他线程的性能。多线程的主要好处是优化使用 CPU 等资源,并提高分配操作的执行时间。
同步
线程以异步方式执行,因此,无法预测他们将如何互动。有时,多个线程可能尝试访问单个资源,然后会出现问题,因为它可能会创建分配任务的错误结果。这时,同步就派上用场了,它确保单个线程可以同时访问给定的资源。这是可能的,因为有锁对象保护同步区域。当线程进入该区域时,锁就会分配给它,并在执行任务后释放锁。直到资源繁忙,其他线程才会在队列中等待。
静态同步
当我们使用这种类型的同步时,如果一个线程位于静态同步区域中,所有其他尝试访问该区域的线程都将被阻止。由于静态方法属于类,因此静态同步应用类级锁。
语法
static synchronized returnType nameOfMethod( Type parameters) {
// 代码
}
这里returnType可以是void或任何原始数据类型。 参数包含变量名称,后跟数据类型。
无静态同步的多线程示例
这是一个简单的示例,可能会也可能不会打印计数器值序列,每次运行它时,它都会根据线程的 CPU 可用性产生不同的结果。
示例
package com.yxjc123;
class PrintDemo {
public static void printCount() {
try {
for(int i = 5; i > 0; i--) {
Thread.sleep(50);
System.out.println("Counter --- " + i );
}
} catch (Exception e) {
System.out.println("Thread interrupted.");
}
}
}
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo( String name) {
threadName = name;
}
public void run() {
PrintDemo.printCount();
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo t1 = new ThreadDemo( "Thread - 1 " );
ThreadDemo t2 = new ThreadDemo( "Thread - 2 " );
t1.start();
t2.start();
//等待线程结束
try {
t1.join();
t2.join();
} catch ( Exception e) {
System.out.println("Interrupted");
}
}
}
每次运行此程序时都会产生不同的结果 -
输出
Starting Thread - 1
Starting Thread - 2
Counter --- 5
Counter --- 5
Counter --- 4
Counter --- 4
Counter --- 3
Counter --- 3
Counter --- 2
Counter --- 2
Counter --- 1
Counter --- 1
Thread Thread - 1 exiting.
Thread Thread - 2 exiting.
静态同步的多线程示例
这是按顺序打印计数器值的相同示例,每次运行它时,它都会产生相同的结果。这次我们将同步关键字放在方法上,以便在方法执行期间根据对象锁定完整的方法。
示例
package com.yxjc123;
class PrintDemo {
public static synchronized void printCount() {
try {
for(int i = 5; i > 0; i--) {
Thread.sleep(50);
System.out.println("Counter --- " + i );
}
} catch (Exception e) {
System.out.println("Thread interrupted.");
}
}
}
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo( String name) {
threadName = name;
}
public void run() {
PrintDemo.printCount();
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo t1 = new ThreadDemo( "Thread - 1 " );
ThreadDemo t2 = new ThreadDemo( "Thread - 2 " );
t1.start();
t2.start();
//等待线程结束
try {
t1.join();
t2.join();
} catch ( Exception e) {
System.out.println("Interrupted");
}
}
}
每次运行此命令时都会产生以下结果程序 -
输出
Starting Thread - 1
Starting Thread - 2
Counter --- 5
Counter --- 4
Counter --- 3
Counter --- 2
Counter --- 1
Thread Thread - 1 exiting.
Counter --- 5
Counter --- 4
Counter --- 3
Counter --- 2
Counter --- 1
Thread Thread - 2 exiting.