Java 多线程同步

技术博客 (151) 2023-09-16 16:22:01

Java 线程同步是 Java 多线程编程中的一个非常重要的概念。在多线程编程中,多个线程可能同时访问共享资源,如果没有合适的同步机制,会导致数据不一致或者程序异常。本文将详细介绍 Java 线程同步的概念,以及如何使用 Java 代码来实现线程同步。

Java 线程同步

Java 线程同步是指多个线程访问共享资源时,通过互斥访问的方式保证数据的正确性。Java 中提供了多种同步机制,包括 synchronized 关键字、Lock 接口和 AtomicInteger 等类。

synchronized 关键字

synchronized 关键字是 Java 线程同步的最基本机制。synchronized 关键字可以用于方法或代码块的同步。

  1. 方法同步:在方法声明中使用 synchronized 关键字可以使得整个方法都是线程安全的。例如:
public synchronized void method() { 
   
    // do something
}

在上面的代码中,整个 method() 方法都是同步的,任何线程在执行该方法时,都会先获取该对象的锁才能执行。

  1. 代码块同步:在代码块中使用 synchronized 关键字可以使得代码块中的语句同步执行。例如:
synchronized (obj) { 
   
    // do something
}

在上面的代码中,obj 表示需要同步的对象,只有获取了 obj 对象的锁,才能执行代码块中的语句。

Lock 接口

除了 synchronized 关键字之外,Java 还提供了 Lock 接口来实现线程同步。Lock 接口提供了更加灵活的同步机制,可以实现更加细粒度的同步控制。Lock 接口的常用实现类是 ReentrantLock。

  1. Lock 接口的使用示例:
Lock lock = new ReentrantLock();
lock.lock();
try { 
   
    // do something
} finally { 
   
    lock.unlock();
}

在上面的代码中,我们首先创建了一个 ReentrantLock 对象,并调用 lock() 方法获得锁。然后,在 try-catch-finally 语句块中执行需要同步的代码。最后,在 finally 语句块中调用 unlock() 方法释放锁。

AtomicInteger 类

除了 synchronized 关键字和 Lock 接口之外,Java 还提供了一些原子类,例如 AtomicInteger,可以实现线程安全的原子操作。原子操作是指不可中断的单个操作,因此可以保证多线程访问时的线程安全。

  1. AtomicInteger 的使用示例:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();

在上面的代码中,我们首先创建了一个 AtomicInteger 对象,并初始化为 0。然后,调用 incrementAndGet() 方法实现原子自增操作,可以保证多线程访问时的线程安全。

线程同步示例代码

下面是一个使用 Java 代码演示线程同步的示例程序:

public class ThreadSyncExample implements Runnable { 
   

    private static int count = 0;
    private static Object lock = new Object();

    public void run() { 
   
        synchronized (lock) { 
   
            for (int i = 0; i < 1000000; i++) { 
   
                count++;
            }
        }
    }

    public static void main(String[] args) throws InterruptedException { 
   
        Thread t1 = new Thread(new ThreadSyncExample());
        Thread t2 = new Thread(new ThreadSyncExample());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("count = " + count);
    }
}

在上面的代码中,我们创建了一个实现了 Runnable 接口的类 ThreadSyncExample。在 run() 方法中,我们使用 synchronized 关键字将需要同步的代码块进行同步,保证多线程访问时的线程安全。在 main() 方法中,我们创建了两个新线程并启动它们,然后使用 join() 方法等待两个线程执行完毕。最后,我们输出 count 的值,确认它的值为 2000000,说明线程同步机制起到了作用。

总结

本文介绍了 Java 线程同步的概念以及如何使用 Java 代码来实现线程同步。Java 线程同步是 Java 多线程编程中的一个非常重要的概念,掌握线程同步可以帮助我们更好地保证多线程访问共享资源时的数据正确性和程序正常运行。在实际编程中,我们可以使用 synchronized 关键字、Lock 接口和原子类等多种机制来实现线程同步。

THE END

发表回复