为什么UI元素必须始终从UI线程创建/更新?
在(几乎?)所有编程语言中,只有从UI线程才能安全地访问/修改UI元素。我理解这是标准的并发访问和同步问题,但这真的是必要的吗?这种行为是由编程语言还是操作系统强制实施的?是否有任何编程语言中的情况不同?
为什么UI元素必须始终从UI线程创建/更新?
在(几乎?)所有编程语言中,只有从UI线程才能安全地访问/修改UI元素。我理解这是标准的并发访问和同步问题,但这真的是必要的吗?这种行为是由编程语言还是操作系统强制实施的?是否有任何编程语言中的情况不同?
这是由图形框架所强制执行的 - 这通常(但并非总是)由操作系统提供。
基本上,使所有东西“正确地线程安全”是低效的。虽然必须将调用返回到UI线程可能很烦人,但它允许UI线程自身快速处理事件,而无需担心锁定等问题。
让整个UI线程变得安全将会非常昂贵(慢)。更好的做法是将负担放在程序员身上,在(相对较少的)情况下,当一个线程需要更新UI时进行同步。
这是因为UI框架是按照这种方式设计的。理论上可以设计一个真正多线程的UI框架,但很难避免死锁。
Graham Hamilton撰写了一篇关于此的好文章,并参考了主要的Java UI框架Swing。