点击投放广告点击投放广告点击投放广告点击投放广告
点击投放广告点击投放广告点击投放广告点击投放广告
广告
广告
广告
广告
广告
搜索
Hi~登录注册
查看: 991|回复: 0

[游戏修改教程] 三国天堂2为什么要线程安全

[复制链接]

29

主题

29

帖子

67

积分

常驻人口

Rank: 2

积分
67

最佳新人

发表于 2022-6-7 21:56:26 | 显示全部楼层 |阅读模式
三国天堂2为什么要线程安全
在大多数情况下,各个线程之间掌握的资源对彼此都是不可视的状态。一个正常的程序也不会频繁的线程之间互相询问状态。而CPU的调度又是随机的,这样就会出现线程安全的问题。
举例:
假设我们现在有一个变量
boolean a = false;
现在有2条线程TA,TB
我们用2条线程对a进行取值,重新赋值,和输出结果。
由于CPU的调度是不确定性的,那么就会出现下面这种情况。
TA先访问a 获取到a当前值为false
随后CPU立刻切换到TB,TB访问了a获取到了false,这个时候CPU没有切换回TA,TB对a进行了修改,将a = true
这个时候TA是不知道a的值已经修改为true了,
然后CPU切换回TA 让他输出a的值,他输出了false,而实际上内存中的a已经为true了
这就是一种常见的线程安全问题。

如果你要保证数据完全准确,就必须考虑线程安全。

线程安全的实现思路非常简单(同步)。
在Java中有一个关键字叫做synchronized,表示线程安全,其原理是对要访问的数据进行加锁,当另外一个线程中途访问此数据时,因为此数据有锁,另外一个线程不会立刻访问,而是暂时等待一下,等原始线程处理结束后,系统会自动释放锁。
这就好比试衣间,一个人进去以后,会挂起锁,另外一个人是不能进去的。
synchronized 属于“重型”锁,使用synchronized后,系统的性能会大幅下降。


synchronized的使用方法举例

这是一个普通方法;
public void addExp(int value)
{
exp+= value;
}



下面是一个同步的方法:
public synchronized void addExp(int value)
{
exp+= value;
}


注意:当系统访问了 addExp方法时,锁定的不是该方法,而是当前访问的对象,所以该对象的其他属性也暂时无法被其他线程访问

游乐论坛-免责声明

1、游乐论坛-游乐网单-游乐单机游戏所有网单资源来源于网络,仅供学习交流之用,切勿用于商业用途.

2、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意.

3、游乐论坛游戏提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!

4、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担.

5、游乐论坛游戏所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站.

6、游乐论坛游戏使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,游乐论坛游戏不承担任何责任,本站已经进行告知义务.

7、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束.

8、游乐论坛游戏以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!

9、游乐论坛游戏如无意中侵犯了某个企业或个人的知识产权,请联系站长邮箱:zhl5@zhl5.com告之,本站将立即删除并致以最深的歉意.

游客
回复
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

广告
广告
广告
广告
广告
快速回复 返回顶部 返回列表