当前位置: 首页 > 面试题库 >

了解事前发生和同步[重复]

马朝斑
2023-03-14
问题内容

这个问题已经在这里有了答案

在一致之前如何理解发生的事情 (4个答案)

2年前关闭。

我试图理解Java
发生在订单概念之前的事情,并且有些事情似乎非常令人困惑。据我所知,之前发生的只是一系列动作的顺序,并不提供有关实时执行顺序的任何保证。实际上(强调我的):

应该注意的是,两个动作之间存在先发生关系并不一定意味着在实现中它们必须按照该顺序进行。 如果重新排序产生的
结果与合法执行相符,则不合法。

因此,所有它说的是,如果有两个动作w(写)和r(读),使得 HB(W,R) ,比r 威力
其实之前发生w在执行,但不能保证它会的。w读操作也会观察到写操作r

如何确定运行时随后执行了两个操作?例如:

public volatile int v;
public int c;

动作:

Thread A
v = 3;  //w

Thread B
c = v;  //r

这里有,hb(w, r)但这并不意味着赋值c后将包含值3。如何执行c分配给3的值?
同步命令

是否提供这种保证?


问题答案:

当JLS说线程A中的某个事件X在与线程B中的事件Y 建立关系 之前发生 一个事件时,这并不意味着X将在Y之前发生。

这意味着 如果 X发生在Y之前,那么两个线程都将 同意 X发生在Y之前。也就是说,两个线程都将以与X发生在Y之前一致的状态看到程序的内存。

都是关于内存的。线程通过共享内存进行通信,但是,当系统中有多个CPU时,所有CPU都试图访问同一内存系统,那么内存系统将成为瓶颈。因此,允许典型的多CPU计算机中的CPU进行延迟,重新排序和缓存操作,以加快处理速度。

当线程不会彼此互动的伟大工程,但是当他们实际上希望交互它引起的问题:如果线程A存储值转换成一个普通的变量,Java使得没有关于何时(甚至保证 如果
)线程B会看到价值变化。

为了克服重要的问题,Java为您提供了一些 同步
线程的方法。也就是说,使线程在程序的内存状态上达成共识。所述volatile关键字和synchronized关键字是线程之间建立同步的两种手段。

我认为他们之所以称其为“之前发生”,是为了强调这种关系的传递性:如果您可以证明A发生在B之前,并且可以证明B发生在C之前,则根据JLS中指定的规则,您已经证明A发生在C之前。



 类似资料:
  • 问题内容: 同步语句建立事前关联。但是我不确定细节。在http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package- summary.html中, 可以阅读 发生监视器的解锁(同步块或方法退出)-在该监视器的每个后续锁定(同步块或方法入口)之前 我想知道我是否理解正确。因此,请看以下示例。假设有2个线程T1,T2共享类D

  • 我遇到了以下关于从生产者同步发送。我知道上下文生产者中的异步机制 在此将来调用get()将阻塞,直到相关请求完成,然后返回记录的元数据或引发发送记录时发生的任何异常。 什么是真正的意思相关联的请求完成,我是相当这不是指完整的请求,但在什么程度上这个短语是指?直到经纪人?直到生产者等使用的缓冲区...? 当ack=all与同步生产者和异步生产者一起使用时,它有什么不同?两个场景都被阻塞以进行确认?

  • 我们有一个包含对象集合的开发服务器。这些对象的实际积累是一个持续的过程,在这个本地开发服务器上运行标签、验证等的整个过程。一旦这些对象准备好生产,它们就会被添加到生产数据库中,从那时起,生产数据库将在其计算中使用它们。 我正在寻找一种简单地将增量(新对象)添加到生产数据库中的方法,同时将所有其他集合和旧对象保留在同一个集合中。到目前为止,我们一直使用MySql,所以这个过程只涉及运行数据库结构和数

  • 问题内容: 我正在使用同时使用JMS和Hibernate的独立应用程序。 该文档建议,如果我想同时使用这两种资源进行事务处理,则必须使用JTA。 但是,现在使用带有@Transaction注释的DAO方法(和HibernateTransactionManager),这似乎已经可以工作。当我在JmsTemplate上调用send()时,消息不会立即发送,而是随着方法的返回,使用Hibernate会话

  • 我试图找出如何在事务上下文中正确处理原子级的对Kafka的多次写入。在此场景中,事务不是由kafka消息侦听器启动的,而是通过@Transactional注释以编程方式启动的,请参见下面的代码段。 我使用的是spring boot 2.4.2和spring kafka 2.6.5。 KafkaProducer文档指出,在事务上下文中,不需要调用。get(),因为它最终会在尝试提交事务时引发异常。此

  • 请参阅代码。 > 当我调用方法@Async loadMarkUpPCT()时,数据没有提交到表中。它表现得好像是非牵引的。 当我从loadMarkUpPCT(类1)中删除@Async(即非异步)时,数据被提交并按预期正常:事务性) 我希望@Async和@Transactional的结果是一样的,但事实并非如此。请解释一下,我做错了什么? 编辑:我刚编辑过代码日志 流程方面:AppDataLoade