读写锁的使用

package concurrent;

import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;

/**
*1、readLock可重入;
*2、writeLock必须等待所有的readLock释放后才可进入;
*3、writeLock范围内,readLock不可进入
*/
public class ReadWriteLockTest {

private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

private ReadLock readLock = readWriteLock.readLock();

private WriteLock writeLock = readWriteLock.writeLock();

private String shareData = "寂寞等待中。。。";

public ReadWriteLockTest() {
}

public void write(String str) {
writeLock.lock();//可用tryLock()干点其他事
// if(!writeLock.tryLock()){
// System.err.println("读锁数量:"+readWriteLock.getReadLockCount());
// return;
// }
System.err.println("ThreadName:" + Thread.currentThread().getName() + " locking...");
try {
shareData = str;
System.err.println("ThreadName:" + Thread.currentThread().getName() + " 修改为:" + str);
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.err.println("ThreadName:" + Thread.currentThread().getName() + " unlock...");
writeLock.unlock();
}
}

public String read() {
readLock.lock();
System.out.println("ThreadName:" + Thread.currentThread().getName() + " lock...");
try {
System.out.println("ThreadName:" + Thread.currentThread().getName() + " 获取为:" + shareData);
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readLock.unlock();
System.out.println("ThreadName:" + Thread.currentThread().getName() + " unlock...");
}
return shareData;
}

/**
* @param args
*/
public static void main(String[] args) {

final ReadWriteLockTest shareData = new ReadWriteLockTest();

for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {

@Override
public void run() {
shareData.read();
}
}, "get Thread-" + i).start();
}

for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
shareData.write(new Random().nextLong() + "");
}
}, "write Thread-" + i).start();

}
}
}
在Qt中,使用`QReadWriteLock`(读写锁)是一种处理多线程共享资源的方式,特别是在大量读取少于少量写入的场景下,它能提供更好的性能。下面是使用`QReadWriteLock`的基本步骤: 1. **包含头文件**: ```cpp #include <QReadWriteLock> ``` 2. **创建锁对象**: ```cpp QReadWriteLock readWriteLock; ``` 3. **读取模式(Reader Locking)**: - 对于读取操作,使用`QReadLock`: ```cpp QReadLock readLock(readWriteLock); // 现在可以安全地读取数据,不会阻止其他读者或写作者 ``` - `readLock.unlock()` 当完成读取后,记得释放锁。 4. **写作模式(Writer Locking)**: - 对于写入操作,使用`QWriteLock`: ```cpp QWriteLock writeLock(readWriteLock); // 现在可以独占锁,其他所有线程都必须等待直到写操作结束 // 进行写操作... writeLock.unlock(); // 写完后释放写锁 ``` 5. **避免竞态条件**: - 避免在读锁内写,也不要在写锁内读,除非是真正的原子操作。 - 如果可能,鼓励短时间的写操作,并尽快释放写锁,让其他读者进入。 6. **错误处理**: 使用异常处理来确保在意外情况下能正确解锁,例如在函数返回前。 以下是一个简化的示例: ```cpp void processData() { QReadLock readLock(dataLock); // 获取读锁 if (dataIsReady()) { processReadingData(); } readLock.unlock(); QWriteLock writeLock(dataLock); // 获取写锁 updateData(); writeLock.unlock(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值