Java 简明教程
Java - Static Synchronization
Synchronization 是一种建立多个试图访问共享资源的线程间协作的方式。对于可靠的线程交互是必需的,并且使用“synchronized”关键字来完成此操作。在这里,线程是一个大型操作中的小的子进程。在本文中,我们将学习静态同步,以及它们如何管理线程,使其能够高效地工作。
Multithreading
Multithreading 是一种 feature of Java programming language,使我们能够同时执行多个操作。其中,操作被分成多个称为线程的小部分。每个线程执行一个独立的任务,而不影响其他线程的性能。多线程的主要优点是对资源(例如 CPU)进行了最佳使用,并且它加快了分配的操作的执行时间。
Synchronization
线程是以异步方式执行的,因此无法预测它们将如何交互。有时,多个线程可能尝试访问单个资源,然后会发成问题,因为它可能会创建分配的错误任务结果。这时,同步就会发挥作用,并确保一个线程一次只能访问给定的资源。这是因为存在守护同步区域的锁对象。当一个线程进入该区域时,锁将被分配给它,而且在执行它的任务后它将释放锁。直到资源占用,其他线程都在队列中等待它们的轮次。
Static Synchronization in Java
当我们使用这种同步类型时,如果一个线程在静态同步区域,则尝试访问此区域的所有其他线程将被阻塞。由于静态方法属于类,因此静态同步应用类级别锁。
Syntax of Static Synchronization
static synchronized returnType nameOfMethod( Type parameters) {
// code
}
这里,returnType 可能为空或任何原始数据类型。parameters 包含变量名称,后跟数据类型。
Multithreading Without Static Synchronization
这是一个简单的示例,它可能并不会按顺序打印 counter 的值,而且每次运行都会基于线程对 CPU 的可用性产生不同的结果。
Example of Multithreading Without Static Synchronization
package com.tutorialspoint;
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();
// wait for threads to end
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.
Multithreading With Static Synchronization
这是一个在每次运行时都会按顺序打印 counter 值的示例,而且每次都产生相同的结果。这次,我们在一个方法上放了 synchronized 关键字,因此在方法执行期间,整个方法会按照对象锁定。
Example of Multithreading With Static Synchronization
package com.tutorialspoint;
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();
// wait for threads to end
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.