0
点赞
收藏
分享

微信扫一扫

Java并发编程深入:代码示例与分析

理论知识的学习是基础,而通过编写和分析实际的代码,开发者能够更深刻地理解并发控制的细节。本文将提供一些Java并发编程的代码示例,并对关键部分进行分析。

示例一:使用synchronized实现同步

以下是一个简单的示例,展示了如何使用synchronized关键字来保证方法在多线程环境下的线程安全。

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

分析:在这个示例中,increment方法和getCount方法都被标记为synchronized。这意味着同时只有一个线程可以执行这两个方法中的任意一个。如果有多个线程尝试访问这些同步方法,它们将会被阻塞,直到当前线程释放对象锁。

示例二:使用ReentrantLock进行锁管理

下面的代码展示了如何使用java.util.concurrent.locks.ReentrantLock来实现线程间的同步。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class CounterWithLock {
    private final Lock lock = new ReentrantLock();
    private int count = 0;

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

分析ReentrantLock提供了比内置锁(synchronized)更灵活的锁定机制。在这个例子中,我们手动地获取锁和释放锁。try-finally块确保了即使在count++抛出异常的情况下,锁也会被释放,这避免了死锁的发生。

示例三:使用waitnotify进行线程间通信

以下示例展示了如何使用waitnotify方法在两个线程间发送信号。

public class Data {
    private String packet;

    // True if receiver should wait
    // False if sender should wait
    private boolean transfer = true;

    public synchronized void send(String packet) {
        while (!transfer) {
            try {
                wait();
            } catch (InterruptedException e)  {
                Thread.currentThread().interrupt(); 
                Log.error("Thread interrupted", e); 
            }
        }
        transfer = false;
        
        this.packet = packet;
        notifyAll();
    }

    public synchronized String receive() {
        while (transfer) {
            try {
                wait();
            } catch (InterruptedException e)  {
                Thread.currentThread().interrupt();
                Log.error("Thread interrupted", e);
            }
        }
        transfer = true;

        notifyAll();
        return packet;
    }
}

分析:这个例子中的send方法和receive方法都是同步的。send方法在transferfalse时等待,这表示接收者还没有接收到数据。类似地,receive方法在transfertrue时等待,这表示发送者还没有发送数据。wait调用会释放锁,而notifyAll会通知所有等待的线程锁已经可用。

结论

这些代码示例提供了并发控制的具体实现方法。通过这些示例,开发者可以学习如何在Java中实现线程同步,以及如何在多线程程序中进行线程间的通信。理解这些基本构建块是构建更复杂并发系统的基础。开发者应该练习这些示例,并尝试在自己的项目中实现相似的并发控制模式。

举报

相关推荐

0 条评论