gpt4 book ai didi

java - Java 中的同步 - 我们可以为 Java 中的同步访问设置优先级吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:06 27 4
gpt4 key购买 nike

同步通过在方法名称前放置 Synchronized 关键字来提供对对象或方法的独占访问。如果同时发生对一个方法的两次或多次访问,我想给予一个特定访问更高的优先级怎么办?我们能做到吗?

或者可能是我误解了 java 中同步的概念。请纠正我。我还有其他问题,

在什么情况下我们应该让方法同步?什么时候使方法同步?什么时候使 block 同步?另外,如果我们使方法同步,类也会同步吗?在这里有点困惑。

请帮助。谢谢。

最佳答案

在 concurrent 包中几乎所有你需要的多线程和同步都有一个解决方案,但是需要先考虑一下你要做什么。 synchronized、wait 和 notify 构造就像是最基本的工具,如果你只是要解决一个非常基本的问题,但实际上大多数高级程序将(/应该)永远不会使用这些工具,而是依赖 Concurrent 包中可用的工具。

您对线程的看法有点不对。没有更重要的线程,只有更重要的任务。这就是 Java 明确区分 Threads、Runnables 和 Callables 的原因。

同步是一种防止多个线程进入代码的特定部分的概念,这再次是避免线程问题的最基本概念。如果多个线程访问某些数据,并且这些多个线程中至少有一个正在尝试修改该数据,就会发生这些问题。考虑一个由线程 A 读取的数组,同时由线程 B 写入。最终线程 B 将写入线程 A 即将读取的单元格。现在由于线程的执行顺序是未定义的,线程 A 是否会读取旧值、新值或介于两者之间的某些东西也是未定义的。

围绕此访问的同步“锁定”是确保这种情况永远不会发生的一种非常粗暴的方式,并发包中提供了更复杂的工具,例如 CopyOnWriteArray,它通过为写入创建副本来无缝处理上述问题线程,因此线程 A 和线程 B 都不需要等待。其他工具可用于其他解决方案和问题。

如果你深入研究可用的工具,你很快就会发现它们非常复杂,使用它们的困难通常在于程序员而不是工具,因为无数小时的思考、改进和测试已经消失进入那些。

编辑:澄清一下为什么重要性在任务上,即使您将它设置在线程上:想象一条有 3 条车道的街道变窄为 1 条车道(同步块(synchronized block))并且有 5 辆汽车(线程)到达。让我们进一步假设有一个人(汽车调度员)必须定义哪些汽车获得第一行,哪些汽车获得其他行。由于只有一条车道,他最多只能安排一辆车到第一排,其他的需要排在后面。如果所有汽车看起来都一样,他很可能或多或少随机分配顺序,而已经在前面的汽车可能更可能留在前面,只是因为移动这些汽车会很麻烦。

现在假设一辆车的顶部有一个标志“里面是美国总统”,所以调度器很可能会在他的决定中优先考虑这辆车。但是虽然标志在车上,但他做这个决定的原因并不是车(线程)的重要性,而是车里面的人(任务)的重要性。所以这个标志只是给调度员的一个信息,这辆车运送更重要的人。然而,这是否属实,调度员不能说(至少不能在没有检查的情况下说),所以他只需要相信汽车上的标志。

现在,如果在另一种情况下,所有 5 辆汽车都有“President inside”标志,调度程序无法决定哪辆先行,他又会遇到与所有汽车都有相同情况的情况一点迹象都没有。

关于java - Java 中的同步 - 我们可以为 Java 中的同步访问设置优先级吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com