京东面试官:公司项目中 Java 的多线程一般用在哪些场景?

文章讨论了在Servlet中使用ConcurrentHashMap解决线程安全问题的局限性,指出在高并发情况下可能导致不必要的文件读取。作者推荐使用FutureTask和ExecutorService进行任务异步处理,以提高效率。同时也提及了一个Java开发者的学习资源包,包含了系统面试题和技术点覆盖。
摘要由CSDN通过智能技术生成

好的,那就用ConcurrentHashMap,正如他的名字一样,他是一个线程安全的HashMap,这样能轻松解决问题。

public class MyServlet extends Servlet{

private static ConcurrentHashMap<String, String> fileName2Data = new ConcurrentHashMap<String, String>();

private void processFile3(String fName){

String data = fileName2Data.get(fName);

if(data==null){

data = readFromFile(fName); //耗时28ms

fileName2Data.put(fName, data);

}

//process with data

}

}

这样真的解决问题了吗,这样虽然只要有用户访问过文件a,那另一个用户想访问文件a,也会从fileName2Data中拿数据,然后也不会引起死循环。

可是,如果你觉得这样就已经完了,那你把多线程也想的太简单了,骚年!你会发现,1000个用户首次访问同一个文件的时候,居然读取了1000次文件(这是最极端的,可能只有几百)。What the fuckin hell!!!

难道代码错了吗,难道我就这样过我的一生!

好好分析下。Servlet是多线程的,那么

public class MyServlet extends Servlet{

private static ConcurrentHashMap<String, String> fileName2Data = new ConcurrentHashMap<String, String>();

private void processFile3(String fName){

String data = fileName2Data.get(fName);

//“偶然”-- 1000个线程同时到这里,同时发现data为null

if(data==null){

data = readFromFile(fName); //耗时28ms

fileName2Data.put(fName, data);

}

//process with data

}

}

上面注释的“偶然”,这是完全有可能的,因此,这样做还是有问题。

因此,可以自己简单的封装一个任务来处理。

public class MyServlet extends Servlet{

private static ConcurrentHashMap<String, FutureTask> fileName2Data = new ConcurrentHashMap<String, FutureTask>();

private static ExecutorService exec = Executors.newCacheThreadPool();

private void processFile3(String fName){

FutureTask data = fileName2Data.get(fName);

//“偶然”-- 1000个线程同时到这里,同时发现data为null

if(data==null){

data = newFutureTask(fName);

FutureTask old = fileName2Data.putIfAbsent(fName, data);

if(old==null){

data = old;

}else{

exec.execute(data);

}

}

String d = data.get();

//process with data

}

private FutureTask newFutureTask(final String file){

return new FutureTask(new Callable(){

public String call(){

return readFromFile(file);

}

private String readFromFile(String file){return “”;}

}

}

}

以上所有代码都是直接在bbs打出来的,不保证可以直接运行。

多线程最多的场景:web服务器本身;各种专用服务器(如游戏服务器);

多线程的常见应用场景:

  • 后台任务,例如:定时向大量(100w以上)的用户发送邮件;

  • 异步处理,例如:发微博、记录日志等;

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

42)]

[外链图片转存中…(img-drBRLG4K-1710749029443)]

[外链图片转存中…(img-rGPmRP6R-1710749029443)]

[外链图片转存中…(img-I0CaWqdU-1710749029444)]

[外链图片转存中…(img-eLCUU3VN-1710749029444)]

[外链图片转存中…(img-xlSrmSBp-1710749029444)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值