本帖最后由 cyqsimon 于 2015-9-30 18:40 编辑
Searge: 昨天的修复"只是"一个资源竞争[1]问题,实体在客户端出现前已经在区块中出现,所以它们对用户不可见
Searge: 不可变数据[2]不会有资源竞争问题,但是我觉得它也会令游戏非常沉闷
推文: https://twitter.com/SeargeDP/status/648836545286422528 https://twitter.com/SeargeDP/status/648836858064052224
[1]: Race Condition Wikipedia Link
[2]: Immutable Object Wikipedia Link
朝阳区看你们全看不懂觉得也该解释一下了
java编程里常常需要用到多线程以提高效率,而多线程就会产生非顺序执行的现象,如果是对于同一个变量的操作就会容易产生错误
在这个特定情况里,个人理解是Internal Server的线程和客户端的线程(Minecraft单机时其实是在后台运行一个完整服务端)同时对单个实体(一个java对象)的数据进行了写入操作,造成出错导致无法正确显示
至于为何不可变数据不会有资源竞争问题,理由其实很简单。资源竞争问题的先发条件是多个线程同时对同一数据进行写入操作。然而不可变数据是不可写入的,自然就不会有资源竞争问题。至于为何说它会令游戏非常沉闷,不可变的游戏会好玩吗?
The bugfix yesterday was "just" a race condition. Entities were added to chunks before those existed on the client, so they were not visible
Searge: 昨天的修复"只是"一个资源竞争[1]问题,实体在客户端出现前已经在区块中出现,所以它们对用户不可见
Immutable data can't have race conditions, but I assume it would also make a very boring game.
Searge: 不可变数据[2]不会有资源竞争问题,但是我觉得它也会令游戏非常沉闷
推文: https://twitter.com/SeargeDP/status/648836545286422528 https://twitter.com/SeargeDP/status/648836858064052224
[1]: Race Condition Wikipedia Link
[2]: Immutable Object Wikipedia Link
朝阳区看你们全看不懂觉得也该解释一下了
java编程里常常需要用到多线程以提高效率,而多线程就会产生非顺序执行的现象,如果是对于同一个变量的操作就会容易产生错误
在这个特定情况里,个人理解是Internal Server的线程和客户端的线程(Minecraft单机时其实是在后台运行一个完整服务端)同时对单个实体(一个java对象)的数据进行了写入操作,造成出错导致无法正确显示
至于为何不可变数据不会有资源竞争问题,理由其实很简单。资源竞争问题的先发条件是多个线程同时对同一数据进行写入操作。然而不可变数据是不可写入的,自然就不会有资源竞争问题。至于为何说它会令游戏非常沉闷,不可变的游戏会好玩吗?
并没有看懂
看不懂怎么办
毒蛇 发表于 2015-9-29 21:22
看不懂怎么办
这个时候想想这不是给我看的就好啦
chyx 发表于 2015-9-29 21:31
这个时候想想这不是给我看的就好啦
机制.如此明事理
反正不是给我看的
mc的沙盒模式正是因为可以大幅度更变的自由模式才有名的,如果都常量了,自然┑( ̄Д  ̄)┍
虽然只能看懂一些。。但是我想说,
这不是线程安全问题吗。。
同步块何在。。?
资源竞争问题的先发条件是多个线程同时对同一数据进行写入操作
这不是线程安全问题吗。。
同步块何在。。?
要方便肯定不能使用Java,Bug太多~
andylizi 发表于 2015-9-30 12:35
虽然只能看懂一些。。但是我想说,
这不是线程安全问题吗。。
就比如说只有一个炉子[furnace],
拿着生鱼的Steve.Hoding.RawFish
于是拎着铁矿石的Steve.Hoding.IronOre因没能及时烧完矿做出装备[iron_helmet] [iron_chestplate] [iron_leggings] [iron_boots] 然后被开除了→_→
最近minecraft1.9被折磨得不轻啊
andylizi 发表于 2015-9-30 12:35
虽然只能看懂一些。。但是我想说,
这不是线程安全问题吗。。
synchronized随意使用会大大降低效率,这里是执行效率和bug风险之间的tradeoff
cyqsimon 发表于 2015-9-30 18:18
synchronized随意使用会大大降低效率,这里是执行效率和bug风险之间的tradeoff
"随意使用" "执行效率"对嘛
所以这就是问题所在
话说如果MC用其他语言写,也会这样吗?(我对其他语言不熟)
cyqsimon 发表于 2015-9-30 18:18
synchronized随意使用会大大降低效率,这里是执行效率和bug风险之间的tradeoff
嗯,同步会导致CPU利用率下降,还是要合理使用其它方法
andylizi 发表于 2015-9-30 18:24
"随意使用" "执行效率"对嘛
所以这就是问题所在
话说如果MC用其他语言写,也会这样吗?(我对其他语言不 ...
支持多线程的语言都有,因为synchronized的实现方式再怎么不同,作用还是一样的:同一个方法在任意时刻只能被单一线程调用,所以对执行效率的影响和实现语言几乎是无关的