从源代码角度看,Java中的线程同步问题

原创 快来打我* 2024-12-02 13:39 130阅读 0赞

在Java中,线程同步主要是通过一些同步机制来实现的,以防止多个线程同时访问和修改共享资源。以下是一些主要的同步方式:

  1. synchronized关键字:用于修饰方法或代码块,使得同一时刻只有一个线程可以执行这些代码。
  1. class Counter {
  2. private int count = 0;
  3. public synchronized void increment() {
  4. count++;
  5. }
  6. public synchronized int getCount() {
  7. return count;
  8. }
  9. }
  1. Lock接口与锁实现类:提供更灵活的同步机制。如ReentrantLock
  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. class LockDemo {
  4. private Lock lock = new ReentrantLock();
  5. public void thread1() {
  6. lock.lock(); // 获取锁
  7. try {
  8. System.out.println("Thread 1: Running... ");
  9. Thread.sleep(3000); // 模拟耗时操作
  10. } finally {
  11. lock.unlock(); // 释放锁
  12. System.out.println("Thread 1: Finished.");
  13. }
  14. }
  15. public void thread2() {
  16. lock.lock(); // 获取锁
  17. try {
  18. System.out.println("Thread 2: Running... ");
  19. Thread.sleep(5000); // 模拟耗时操作
  20. } finally {
  21. lock.unlock(); // 释放锁
  22. System.out.println("Thread 2: Finished.");
  23. }
  24. }
  25. public void startThreads() {
  26. new Thread(thread1)).start();
  27. new Thread(thread2)).start();
  28. }
  29. public static void main(String[] args) {
  30. LockDemo demo = new LockDemo();
  31. demo.startThreads(); // 启动线程
  32. }
  33. }
  1. Semaphore信号量:用于控制同时访问特定资源的线程数量。
  1. import java.util.concurrent.Semaphore;
  2. class SemaphoreDemo {
  3. private Semaphore semaphore = new Semaphore(1); // 创建一个允许一次通过的信号量
  4. public void thread1() {
  5. semaphore.acquire(); // 请求信号量,如果允许则获取
  6. try {
  7. System.out.println("Thread 1: Running... ");
  8. Thread.sleep(3000); // 模拟耗时操作
  9. } finally {
  10. semaphore.release(); // 释放信号量,允许其他线程请求
  11. System.out.println("Thread 1: Finished.");
  12. }
  13. }
  14. public void thread2() {
  15. semaphore.acquire(); // 请求信号量,如果允许则获取
  16. try {
  17. System.out.println("Thread 2: Running... ");
  18. Thread.sleep(5000); // 模拟耗时操作
  19. } finally {
  20. semaphore.release(); // 释放信号量,允许其他线程请求
  21. System.out.println("Thread 2: Finished.");
  22. }
  23. }
  24. public void startThreads() {
  25. new Thread(thread1)).start();
  26. new Thread(thread2)).start();
  27. }
  28. public static void main(String[] args) {
  29. SemaphoreDemo demo = new SemaphoreDemo();
  30. demo.startThreads(); // 启动线程
  31. }
  32. }

这些同步机制保证了在多线程环境下,对共享资源的访问和修改能按照预期进行。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,130人围观)

还没有评论,来说两句吧...

相关阅读