如何快速学习:[1]Swift编程语言,Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Ojective-C*共同运行于MacOS和iOS平台,用于搭建基于苹果平台的应用程......
2023-03-17 311 编程语言
java管理线程之间的共享状态
本片介绍java如何管理线程之间的共享状态
先看如下示例:
这个有趣的测试创建了一个新线程, 它采用计数器对象, 并不断地将该值设置为100。在主线程中, 它采用相同的计数器对象, 并将值设置为200。测试随后断言, 该值确实为200。
如果你运行这个测试几次, 你会发现它有时通过, 有时它没有通过。同样, 这是因为允许 jvm 在线程运行时进行计划。如果主线程执行设置, 并在 jvm 中断该线程以允许对CounterSetter运行之前进入计数器对象, 则该值仍将设置为100。
若要确保在另一个线程尝试读取或写入任何共享状态时不修改该共享状态, 必须锁定该共享状态。下图改进了此测试, 以确保此时间建有器不会干扰测试断言的主线程。
每个 java 对象都有锁定的能力。通过使用synchronized(object)包围代码, 在任何时候都只允许在该块中执行一个正在运行的线程。在同步块上标记的对象用作锁。在上图示例中, 使用了实际的计数器对象本身。
涉及该计数器实例的任何读取和写入都已被包围在同步块中, 因此, 当主线程正在更新, 然后重新读取计数器的值时, CounterSetter代码不能干扰该值。你会发现, 现在测试总是通过。
当然, 这种锁定是有代价的。线程在锁定时需要等待其他线程, 因此您可能会看到性能影响。因此, 建议只锁定读取和写入, 而不是更多, 尽快释放锁。
以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!
相关文章
如何快速学习:[1]Swift编程语言,Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Ojective-C*共同运行于MacOS和iOS平台,用于搭建基于苹果平台的应用程......
2023-03-17 311 编程语言
web图表开发工具FineReport:[11]连续分组,数据库表数据是按照时间先后录入的,查询的时候希望按照时间先后,某个字段连续相同的话就合并起来显示,这样的报表可以通过相邻连续分组来实现。......
2023-03-17 533 编程语言