日常思考-多个用户做出同样的请求,该请求在代码中调用同一个方法,那么请问服务器是怎么处理的?

多线程并发的处理,这里指的是服务器端,也就是 Java 的处理,与页面无关。

首先,当多个请求同时到达服务器时,服务器会分配线程来执行每个请求(如果请求数量太多,能用的线程有限,则会进行排队)。所以请求和请求之间首先是一个线程隔离的环境。

每个线程都会按照同样的顺序执行同样的代码(这里简单的不考虑分支),在执行代码的过程中,线程会访问和操作各种各样的对象和变量。

所以这里就有一个问题:我怎么知道多个线程会不会访问到同一个对象,或者同一个变量呢?如果这样的事情发生了,可能会产生什么后果呢?

在详细解释这个问题之前,首先需要明确一个简单的原则:任何对象都可以被任意多个线程访问,这是代码的自由性决定的。但更重要的是,我们可以让对象主动掌控线程对自己的访问。

最简单的控制方式就是 synchronized,意即同时只允许一个线程访问,其它线程必须先等待。当 synchronized 用在方法上时,表示同一时间只允许一个线程执行这个方法。

那么是否意味着服务器上的所有方法都必须是synchronized的呢?不是。当一个方法执行时,所有的变量和参数都会保存在一个叫做堆栈的内存空间,这个内存空间是线程独享的,所以线程之间不会相互冲突。例如:

java 复制代码
public void hello(String name) {
    String greetings = "Hello, " + name;
    System.out.println(greetings);
}

当多个线程执行 hello() 方法时,每个线程都会在自己的堆栈中存放 name 参数和 greetings 变量。其中 greetings 变量是在方法内定义的,一个线程中的 greetings 变量与另一个线程中的 greetings 变量将是完全隔离的,不会相互影响。

堆栈是线程独享的,但是放入堆栈的内容则未必。像上面的例子,greetings 变量是线程自己创建的,所以其它线程访问不到,但 name 参数则未必,有可能多个线程在执行这个方法时,收到的 name 参数是同一个对象。这时候如果方法里面要修改这个对象,那就要小心了。

相关推荐
讯捷蓝达1 分钟前
IBM V3500存储 双控故障、数据怎么恢复?
运维
猫猫.15313 分钟前
HashTable、HashMap、ConcurrentHashMap 核心区别总结
java·开发语言·java-ee
达~熊迪27 分钟前
IP 分配前核查:把在线状态和使用登记一起看
服务器·网络·tcp/ip
qq_谁赞成_谁反对28 分钟前
甲方IT的成长之路--SG TCP网络优化工具--20261026
运维·服务器·udp·tcp
郭小李1 小时前
spring mvc 工作流程
java·spring·mvc
SL_staff1 小时前
BI大屏嵌入MES的登录态难题:JVS统一账号体系实战解法
java·数据分析·数据可视化
乌暮1 小时前
综合案例:宠物电商系统
java·开发语言·spring·mvc·restful·1024程序员节
VimorphTech1 小时前
一段字幕太长,怎样拆句并安排显示时间?
java·spring boot
万联WANFLOW1 小时前
Kimi K3.1 Pro 接口接入指南:模型选型、费用计算与零数据保留
java·spring boot·python·安全·spring·大模型
龙亘川2 小时前
适应人工智能发展、构建就业友好型发展方式
大数据·运维·人工智能·信息可视化·智慧城市