正在使用会话线程安全的

本文关键字:线程 安全 会话 | 更新日期: 2023-09-27 18:05:12

考虑一个用户同时发出多个请求,我是否必须锁定与会话一起工作的所有代码?

例如,我有以下场景,用户在浏览器的一个选项卡中打开了一个页面,而在第二个选项卡中他退出了。

请求1:

if(Session["user"] != null)
    lblName.Text = Session["user"].Name;
请求2:

if(logout)
   Session["user"] = null;

请求1在访问Name属性时是否可能抛出NullPointerException ?我是否需要锁定请求1中的代码,以确保用户在检查null后仍然存在?或者ASP。NET会自动处理这个问题吗?

正在使用会话线程安全的

对ASP的两个请求。如果处理程序不使用IReadOnlySessionState标记接口或为您的页面打开EnableSessionState="ReadOnly",则同一个会话的asp.net应用程序将被ASP. NET序列化。. NET运行时以保证状态的一致性。因此,如果您有两个能够写入会话状态的页面,那么无论客户端在其端执行什么操作,它们都将被串行访问。

由应用程序代码向ASP发送信号。. NET使用上述技术判断页面/处理程序是否要写入会话状态。如果你不这样做,所有的请求将被序列化,你的web应用程序的性能将受到影响。

一如既往,答案取决于您对"安全"的定义。在asp.net中,每个请求获得对其会话状态的独占访问权。这意味着您不必担心在单个请求范围内同步访问。如果Session["user"]是非空的,那么它在当前请求的整个持续时间内都是非空的。在您的示例中,请求1永远不会抛出空引用异常。

. NET中,Session模块在每个会话中使用一对读/写锁,因此请求1将具有一致的读,而请求2将阻塞,直到请求1完成。

是,Session是线程安全的。

不需要锁定任何内容。然而,对检查值的需要始终是必要的。

查看@Peter Ruderman的回答:)

我就不复制了