1. synchronized关键字
synchronized关键字是Java中最基本的线程同步机制。通过将代码块或方法声明为synchronized,我们可以确保同一时间只有一个线程能够访问该代码块或方法。这样可以避免多个线程之间对共享数据的争用。
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
在上面的例子中,使用synchronized关键字修饰了increment()
和getCount()
方法,确保在进行增加计数和获取计数值时只有一个线程能够执行。
2. ReentrantLock类
ReentrantLock是一个可重入锁,它提供了与synchronized相似的功能,但更灵活。与synchronized不同,ReentrantLock提供了更多的操作和控制。
public class Counter {
private int count = 0;
private ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public int getCount() {
lock.lock();
try {
return count;
} finally {
lock.unlock();
}
}
}
在上面的例子中,使用ReentrantLock来实现线程安全的计数器。lock()
方法获取锁,unlock()
方法释放锁。使用try-finally块来确保无论发生什么情况,锁都会被正确释放。
3. ConcurrentHashMap类
ConcurrentHashMap是并发包中用于处理并发访问的Map实现。它提供了线程安全的操作,并且性能较好。
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("one", 1);
map.put("two", 2);
map.put("three", 3);
int value = map.get("two");
System.out.println(value); // 输出: 2
在上面的例子中,ConcurrentHashMap可以安全地被多个线程同时访问和修改,而不需要额外的同步措施。
以上只是并发包中几个常用类的简单示例。在编写多线程应用程序时,了解并发包的使用可以帮助我们更好地处理线程安全和并发问题。希望本篇博客对您理解Java中的线程安全性有所帮助。