问题标签 [synchronized]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - .class 的 Java 同步块
这个java代码是什么意思?它会锁定 的所有对象MyClass
吗?
以及上面的代码与这个代码有何不同:
java - java中的最终变量和同步块
Java中的final变量是什么?例如:如果我写final int temp;
在函数中,final关键字的含义是什么?
另外,我什么时候想使用 final 变量(作为类变量和函数变量)?
为什么必须将同步块中的变量声明为 final?
java - 对象与字节 [0] 作为锁
我之前评论过这个问题(“为什么 java.lang.Object 不是抽象的?”),说我听说使用 abyte[0]
作为锁比使用java.lang.Object
. 我确定我在某处读过这篇文章,但我不记得在哪里:有人知道这是否真的是真的吗?
我怀疑这是由于实例化byte[0]
需要的字节码比 略少Object
,尽管有人指出byte[0]
需要额外的存储空间才能存储长度字段,因此听起来这可能会抵消任何好处。
hibernate - 春天事务可以取消同步同步方法吗?
我的同事和我有一个在 MyEclipse 内的 Tomcat 上使用 Spring 3.0.0 和 JPA(hibernate 3.5.0-Beta2)的 Web 应用程序。其中一种数据结构是树。只是为了好玩,我们尝试用 JMeter 对“插入节点”操作进行压力测试,发现了一个并发问题。Hibernate 报告发现两个具有相同私钥的实体,就在这样的警告之后:
如果多个线程同时调用 insert() 方法,很容易看出这些问题是如何发生的。
我的 servlet A 调用服务层对象 B.execute(),然后它调用较低层对象 C.insert()。(实际代码太大,无法发布,因此有些删节。)
小服务程序 A:
服务乙:
子服务 C:
我所有的状态更改调用都通过 B,所以我决定制作 B.execute() synchronized
。已经是了@Transactional
,但实际上需要同步的是业务逻辑,而不仅仅是持久化,所以这似乎是合理的。
我的 C.insert() 方法也是@Transactional
. 但由于 Spring 中的默认事务传播似乎是必需的,我认为没有为 C.insert() 创建任何新事务。
所有组件 A、B 和 C 都是 spring-beans,因此是单例。如果确实只有一个 B 对象,那么我得出的结论是,一次执行 b.execute() 的威胁不应该超过一个。当负载较轻时,只使用单个线程,就是这样。但是在负载下,会涉及额外的线程,我看到有几个线程在第一个打印“完成”之前打印“开始”。这似乎违反synchronized
了方法的本质。
我决定this
在日志消息中打印以确认是否只有一个 B 对象。所有日志消息都显示相同的对象 ID。
经过多次令人沮丧的调查,我发现删除@Transactional
for B.execute() 可以解决问题。随着那条线的消失,我可以有很多线程,但我总是在下一个“开始”之前看到一个“开始”,然后是一个“结束”(并且我的数据结构保持不变)。不知何故,synchronized
唯一似乎在@Transactional
不存在时起作用。但我不明白为什么。任何人都可以帮忙吗?关于如何进一步调查的任何提示?
在堆栈跟踪中,我可以看到在 A.doPost() 和 B.execute() 之间以及 B.execute() 和 C.insert() 之间生成了一个 aop/cglib 代理。我想知道代理的构造是否会以某种方式破坏synchronized
行为。
java - Java中的同步帮助
查看http://download.eclipse.org/jetty/stable-7/xref/com/acme/ChatServlet.html,我似乎不明白为什么在同步方法中需要一个同步块,就像这样:
如果整个方法已经是线程安全的,为什么还m
需要同步(再次?)?
感谢您的任何见解。
java - 我是否必须同步对 Java 中封装的线程安全数据结构的访问?
说我有这样的事情(我有)
其中一些在自己的线程上运行
我应该在poll()
吗?QueBean
synchronized
java - Collection.synchronizedMap 与同步 HashMap 中的单个方法
Collections.synchronizedMap() 和所有方法同步的 HashMap 的包装器之间有什么区别。我没有看到任何区别,因为 Collections.synchronizedMap() 在内部为所有方法维护相同的锁。
基本上,以下代码片段有什么区别
和
java - Java同步问题
我正在浏览一些查看同步方面的代码片段。我相信锁定发生在对象上。在 java 的情况下,我们只有对对象的引用。Java 应该使用引用来获取对象并锁定它。
如果引用恰好为空会发生什么?我觉得这会打破。如果这要工作,那么锁定也需要在引用上发生(这让我很失望)。有人可以为我澄清这一点。
java - 迭代器并发修改异常
如果在 doSomething() 中修改了列表,此代码将引发并发修改异常。是否可以通过将代码包含在某个同步块中来避免它?
java - Java RMI 和线程同步问题
我实际上有两个关于 Java RMI 和线程同步的问题:
1) 如果我将我的 RMI 远程方法实现为同步的,它们是否保证是互斥的?我需要确保没有两个 RMI 方法(提供给客户的方法)同时执行。
2)我有一个服务器定期执行的方法。它用于进行清理。当远程客户端正在运行/使用任何 RMI 方法时,我必须确保不会执行此特定方法。此外,当该方法运行时,RMI 调用应该是不可能的。即客户必须等待。知道我该怎么做吗?我读过关于锁的文章,但我不知道如何在这种情况下使用它们。
我考虑过将 RMI 方法实现为静态方法,并在 RMI 接口中包含该清理方法,但这似乎不是解决问题的优雅方法。
我还在 RMI 接口中编写了同步的清理方法。当我运行它进行测试时,方法之间似乎没有冲突,但我不能确定。
感谢您的时间和回答。