java 简单性,java-满足高并发性的简单Web服务器

这不是家庭作业,而是我在网上发现的面试问题.

Java代码是:

public class SimpleWebServer{

public static void handleRequest(Socket c)

{

//Process the request

}

public static void main(String[] args) throws IOException

{

ServerSocket server=new ServerSocket(80);

while(true)

{

final Socket connection=server.accept();

Runnable task=new Runnable(){

@Override

public void run()

{

handleRequest(connection);

}

};

new Thread(task).start();

}

}

}

问题是高并发性时会出现哪些潜在问题?我的分析是:

>它没有使用synced关键字,因此可能出现竞态条件发生的情况.

>应该使用效率更高的线程池.

>似乎对于每个传入线程,该类总是创建一个新的ServerSocket,当发生高并发性时,它将占用大量空间吗?

解决方法:

我看到的主要问题是您已经确定的问题.每个请求线程模型固有地存在缺陷(Nginx和lighttpd相对于Apache的广泛采用证明了这一点).迁移到ExecutorService(可能由线程池支持)将是一个不错的选择.

通过从每个请求的线程更改为向ExecutorService的简单任务提交,您可以将此应用程序移至基于事件的模型. Web上有很多资料讲授基于事件的模型比基于线程的模型的可伸缩性优点.

在handleRequest方法上使用’synchronized’是一种蛮力策略,并且根据该方法的特殊要求,更细粒度的锁定策略(或无锁定逻辑)将是首选.您提到的ServerSocket创建仅在应用程序中发生一次,因此这实际上不是可伸缩性问题. accept方法的确为每个连接创建了一个新的Socket实例,但这很便宜.查看JDK 6源代码,这包括分配7个布尔值,一个锁对象以及检查一些内部状态-即可能不会有问题.

基本上,您在正确的道路上!希望这可以帮助.

标签:concurrency,java

来源: https://codeday.me/bug/20191030/1971465.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值