java锁:第四章:读写锁

本文分析了一线大厂Java面试中的并发编程问题,讨论了如何通过ReentrantReadWriteLock解决写入和读取共享资源的原子性和独占性问题。作者强调了通过实际面试题分析技术栈的重要性,鼓励读者系统学习并提升Java及相关技术以提高求职竞争力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

Thread.sleep(300);

Object value = map.get(key);

System.out.println(Thread.currentThread().getName()+“\t 读取完成:”+value);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public class Demo {

public static void main(String[] args) {

Data data = new Data();

//五个写的线程

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

final int tempInt = i;

new Thread(()->{

data.put(tempInt+“”,tempInt+“”);

},String.valueOf(i)).start();

}

//五个读的线程

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

final int tempInt = i;

new Thread(()->{

data.get(tempInt+“”);

},String.valueOf(i)).start();

}

}

}

控制台:

可以看到写的操作原子性和独占性没有得到保证,0线程正在写入共享资源的时候,其他线程有写入和读取的共享资源操作,导致数据不一致。

是否可以添加Lock锁解决原子性和独占性的问题?

不可以,因为添加

private Lock lock = new ReentrantLock();

只能保证一个线程读,不能让多个线程同时读取,不符合实际需求。

使用ReentrantReadWriteLock解决原子性和独占性,可以很好的解决并发性和数据的一致性

读写锁的代码:

package com.javaliao.backstage;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.locks.ReentrantReadWriteLock;

class Data{

private volatile Map map = new HashMap<String,Object>();

private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

public void put(String key,Object value){

//写锁

lock.writeLock().lock();

try {

System.out.println(Thread.currentThread().getName()+“\t 正在写入:”+key);

Thread.sleep(300);

map.put(key,value);

System.out.println(Thread.currentThread().getName()+“\t 写入完成”);

} catch (InterruptedException e) {

e.printStackTrace();

}finally {

lock.writeLock().unlock();

}

}

public void get(String key){

//读锁

lock.readLock().lock();

try {

System.out.println(Thread.currentThread().getName()+“\t 正在读取”);

Thread.sleep(300);

Object value = map.get(key);

System.out.println(Thread.currentThread().getName()+“\t 读取完成:”+value);

} catch (InterruptedException e) {

e.printStackTrace();

}finally {

lock.readLock().unlock();

}

}

}

public class Demo {

public static void main(String[] args) {

Data data = new Data();

//五个写的线程

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

final int tempInt = i;

new Thread(()->{

data.put(tempInt+“”,tempInt+“”);

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
JVmr4-1714501603285)]

[外链图片转存中…(img-KkHIA7aL-1714501603285)]

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值