关于线程安全的问题求解

如果说一个项目在一个服务器上,比如多个管理员修改一个用户的信息,
会出现线程安全问题吗,一个服务器上程序应该是按照顺序执行的,不会出现
线程安全问题吧?比如A用户跟B用户同事点击修改,他会执行A后再执行B,
因为他们的代码在同一台服务器上。

8个回答

单纯说你的假设不完全对,我们的目标是使多个用户在一个服务器上的操作是并发安全的,但是不是说因为在一个服务器上运行的逻辑就肯定是线程安全的。服务器一般会针对每一个request启动一个线程以增加并发的数量,如果两个request针对同一个数据进行修改的话,服务器要在每个request开始时加锁,以保证在一个request处理完成前其他request都被block住,直到那个request处理完了才释放锁,这样下一个等待处理的request抢占锁并开始修改数据。

如果你做了相关状态的限制,以及使用了同步代码,就没问题了

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的;或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题
线程安全问题都是由全局变量及静态变量引起的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全

如果 A和B同时点击,就算你的代码在一台服务器上也是有可能出现 线程全问题的,至于 谁会先执行 是无法确定的
服务器 不回去限制说 A去执行 B先等着这种情况的。

这个涉及到线程同步的问题,为了保证数据安全,多用户访问统一数据,或操作统一数据是,必须做到相应的同步机制来保证数据在同一时刻,只允许同一线程访问或修改

一般来说,一个http请求会创建一个新的操作线程,这会带来线程安全问题,你可以使用乐观锁机制解决问题。

gf0515
Fatal Error 你给用户表加一个版本号字段,每次修改前读取带版本号的数据,写入是校验版本号是否一致,如果一致,版本号加1,写入数据库,这样即便另一个线程在这个过程中读取了数据,写入时版本号已经发生了变化,也不会更新成功的。
大约 2 年之前 回复
StackTc
StackTc 比如我是 有2个管理员 去修改同一个用户的用户信息
大约 2 年之前 回复
StackTc
StackTc 你的回复好像有点道理 可以深入分析一下吗。
大约 2 年之前 回复

如果按你的要求,感觉悲观锁好一点,在管理员A开始修改数据的时候,任何人不能对此数据进行修改,等A修改完了B才对他有修改权限,如果用乐观锁这样做也行吧,但我感觉会出现cookie欺诈的现象,如果内部网的系统不用管没人会用那种东西来黑系统

如果你对用户信息,做了信息同步保护的话,问题就不大,多个管理员访问时,会对应多个线程。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问