最近正在学习多线程,有这样的一个场景,假如我们需要在数据库中更新一条数据,并查询更新后的数据,假如我们不对该程序做并发控制,那么很容易出现数据混乱,例如,A线程将数据改成了1,正准备去查询更新后的结果,此时,B线程又去数据库将数据改成了2,那么A线程最后查询回来的数据是2,而不是自己刚改的1,所以我们很有必要加上并发的控制,代码示例如下:
package com.yonge.lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Test extends Thread {
public static int count = 0;
private ReentrantReadWriteLock lock;
public Test(ReentrantReadWriteLock lock) {
this.lock = lock;
}
@Override
public void run() {
lock.writeLock().lock();
try {
System.out.println("Thread:" + this.getName() + " 开始写... Count:" + count++);
sleep(500);
System.out.println("Thread:" + this.getName() + " +1结束...");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//先后顺序一定要这样写 注意:write锁可以获取read锁,但是read锁不能获取write锁
lock.readLock().lock();
lock.writeLock().unlock();
}
System.out.println("Thread:" + this.getName() + " 开始读... Count:" + count);
lock.readLock().unlock();
}
public static void main(String[] args) {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
for (int i = 0; i < 50; i++) {
new Test(lock).start();
}
}
}
欢迎大家给出意见!
分享到:
相关推荐
掌握锁的优化策略,如读写锁(ReentrantReadWriteLock)。 7. **避免冗余计算**:对计算量大的操作,可以考虑缓存结果,如使用Memoization策略。同时,理解并运用lazy initialization。 8. **IO操作优化**:使用...
3. Lock接口:ReentrantLock、ReentrantReadWriteLock等高级锁的使用。 四、IO与NIO 1. 流的概念:字节流和字符流,以及它们的读写操作。 2. 文件操作:File类的基本使用,以及随机访问文件。 3. NIO:非阻塞I/O,...
通过分析并实践`threadTest`案例,我们可以深入理解Java多线程的原理和使用技巧,为编写高效并发程序打下坚实基础。同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的...
5. **锁机制**:深入理解synchronized关键字,包括可重入锁、互斥锁、读写锁等,以及ReentrantLock、ReentrantReadWriteLock的使用。 6. **并发模式**:如生产者-消费者模式、读者-写者模式、工作窃取模式等,以及...
在Java开发过程中,了解并掌握这些优化技巧可以显著提高应用的响应速度和资源利用率。 首先,我们关注的是代码层面的优化。这包括避免冗余计算、减少不必要的对象创建、使用适当的数据结构和算法。例如,对于频繁...
常见的锁有读写锁(ReentrantReadWriteLock),它可以允许多个读操作同时进行,但同一时刻只允许一个写操作进行。在Java中,还可以使用synchronized关键字或显式锁(Lock)来控制并发。 ### AQS...
- Lock接口:ReentrantLock和ReentrantReadWriteLock的使用,比较与synchronized的区别。 6. **IO流** - 字节流和字符流的区别,以及它们的常用类如FileInputStream、FileOutputStream、BufferedReader、...
另外,`java.util.concurrent.locks`包提供了可重入锁`ReentrantLock`和读写锁`ReentrantReadWriteLock`,它们比`synchronized`更灵活,允许更细粒度的锁控制。 死锁、活锁和饥饿是并发编程中常见的问题,书中会...
在实现高效缓存时,可以使用`ReentrantReadWriteLock`,允许多个读取者同时访问,但写入者独占,确保数据一致性。 3) **wait()与sleep()区别**:`wait()`使线程进入等待状态并释放持有的锁,而`sleep()`则不释放锁...
为了更好地理解和应用这些模式,提供的源码详解文件“java多线程设计模式详解”将详细展示各种模式的实现细节,通过分析源码,读者可以深入掌握Java多线程编程的核心技巧。务必花时间仔细阅读和实践,这对于提升并发...
本文将深入探讨Java并发编程的基础知识、重要概念以及实践技巧,旨在帮助初学者逐步精通这一领域。 首先,我们需要理解"并发"的概念。并发是指多个任务在同一时间段内同时进行,但并不意味着它们一定是并行的。在...
- **并发包详解**:深入分析ConcurrentHashMap、ThreadPoolExecutor、FutureTask、Semaphore、Condition、ReentrantReadWriteLock等类和接口的核心源代码。 - **JVM锁与并发机制**:对比JDK 1.4锁与JDK 5.0并发包的...
虽然`SharedPreferences`的设计初衷不是用来存储复杂的数据结构,比如`List`,但通过一些技巧,我们仍然可以在缓存中利用`SharedPreferences`维护两个`List<String>`。 `SharedPreferences`提供了键值对的存储方式...
- **高效缓存实现:**使用`ReentrantReadWriteLock`来实现高效的缓存。读操作时获取读锁,写操作时获取写锁。由于多个读操作不会相互阻塞,只有写操作时才会有阻塞,因此整体性能较高。 3. **题目3:**Java中`wait...
4. **设计模式**:如生产者消费者模式(BlockingQueue)、读写锁模式(ReentrantReadWriteLock)等,这些都是在并发编程中常见的设计模式。 5. **原子操作**:Atomic类库提供了原子变量,如AtomicInteger,它们的...
本练习集专注于提升你在Java并发编程中的技巧,通过一系列逐步进阶的代码实例,帮助你掌握从基础到高级的并发概念。 首先,我们从“线程安全”开始。线程安全是指在多线程环境下,一个类或方法能够正确地处理并发...
- **读写锁**:`ReentrantReadWriteLock`允许多个读取者同时访问,但在写入时会独占资源,提高了并发性能。 3. **并发工具类** - **并发容器**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`...
然而,实际的解决方案可能更复杂,需要考虑到更多的并发控制策略,例如使用信号量(Semaphore)或者读写锁(ReentrantReadWriteLock)。此外,还可以使用非阻塞的并发控制技术,如Java并发库中的`java.util....