Java线程和更多有关内存模型的信息

本文探讨了Java中原子操作的细节,如volatile变量、引用及32位或更小标量值的写入。深入解析了写入操作的线程间可见性问题,以及如何通过易失性变量确保一致性。揭示了64位非易失性值写入可能产生的垃圾值,以及为何需要同步机制来防止多线程冲突。

我在本系列的第一篇文章如下

http://bytes.com/topic/java/insights...ls-article-1-a

在这里我将讨论更多的事情

1>

Java中哪些操作是原子操作

Ans:写入volatile,写入引用,并写入32位或更小的标量值。 尽管这些操作之一是由线程开始执行的,但该线程必须在其他任何线程尝试写入同一变量之前完成该操作。 因此,这些分配操作可以在代码中的任何位置使用,而不会由于中间线程冲突而产生任何垃圾值。

2>

写入是否立即对另一个线程可见

回答:如果一个线程T1的写操作之后是另一个线程T2的读操作,那么T2是否会看到T1所写的值并不明显。 因为T1可能会从其本地缓存中读取该值,这是一个旧值。

3>

如何使其可见

回答:如果变量是易失性的,那么T2将始终看到T1写入的值。

4>

当由多个线程访问时,哪个操作可能会产生垃圾值

Ans。 写入非易失性64位值(即,长整型和双精度型)。

5>

为什么需要同步

Ans。 假设有4个代码块(snipet),我们永远不希望被多个线程执行。 这意味着当线程T1正在执行这些块中的任何一个时,则同一块或其他3个块中的任何一个都将不会由任何其他线程T2执行。 T2必须等到T1完成。 当T1完成时,只有T2会进入这4个块中的任何一个并执行。

6>

这是如何完成的

Ans。 这是用单词来完成的

同步关键字。

需要按以下方式创建任何A类的对象。

A obj = new A();
然后所有这些代码块都需要如下封装
synchronized(obj){ 
  //Code block: i.e. Lines of code follows  
}

From: https://bytes.com/topic/java/insights/951658-java-threads-more-memory-model

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值