a != a //is this thread-safe
public class TestThreadSafety {
private Object a = new Object();
public static void main(String[] args) {
final TestThreadSafety instance = new TestThreadSafety();
Thread testingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
long countOfIterations = 0L;
while(true){
boolean flag = instance.a != instance.a;
if(flag)
System.out.println(countOfIterations + ":" + flag);
countOfIterations++;
}
}
});
Thread updatingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
instance.a = new Object();
}
}
});
testingReferenceThread.start();
updatingReferenceThread.start();
}
}
当我的程序在一些迭代之间启动时,我会得到输出标志值,这意味着引用!=
检查在同一引用上失败。但经过一些迭代后,输出变为常量值false
,然后长时间执行程序,不会生成一个true
输出。
如输出所示,经过n次(不固定)迭代后,输出似乎是一个常数值,不会改变。
输出:
对于某些迭代:
1494:true
1495:true
1496:true
19970:true
19972:true
19974:true
//after this there is not a single instance when the condition becomes true
在没有同步的情况下,此代码
Object a;
public boolean test() {
return a != a;
}
可能生成true
。这是test()
的字节码
ALOAD 0
GETFIELD test/Test1.a : Ljava/lang/Object;
ALOAD 0
GETFIELD test/Test1.a : Ljava/lang/Object;
IF_ACMPEQ L1
...
正如我们看到的,它将字段a
加载到本地变量两次,这是一个非原子操作,如果a
被另一个线程更改,则可能产生false
。
通过系统内置规则,将匹配规则的安全性较低的资源扫描出来并按照建议进行处理,从而提高系统安全性的目的。 建议列表 建议列表显示所有匹配优化建议规则的资源列表,用户可根据建议对资源进行处理。 忽略列表 忽略列表显示不需要处理的资源或一类规则建议。 规则配置 规则配置即根据系统内影响资源安全的条件设置相应的规则,如安全组的规则设置等,当资源匹配规则则表示资源的安全性较低,需要用户进行处理等。
本文向大家介绍双重检查加锁单例 线程安全-Java版相关面试题,主要包含被问及双重检查加锁单例 线程安全-Java版时的应答技巧和注意事项,需要的朋友参考一下 双重检验加锁模式(double checked locking pattern),是一种使用同步块加锁的方法。程序员称其为双重检查锁,因为会有两次检查 ,一次是在同步块外,一次是在同步块内。为什么在同步块内还要再检验一次?因为可能会有多个线
安全检测(该工具已下线) 安全检测工具用语说明 挂马:指网站被黑客通过入侵手段拿到修改页面的权限,在网页的源代码中插入网页木马(恶意代码),用户在访问网页时就会运行网页木马受到漏洞攻击,从而自动下载并执行病毒木马程序。网站被挂马会导致访问网站的用户电脑感染病毒木马,可能会遭受远程控制、泄露文档资料、账户密码等信息,危害极大。网站在被其他人发现存在挂马后,搜索引擎、杀毒软件、浏览器等会进行拦截用户访
问题内容: 自从我将哈希表用于任何重要的事情以来已经有一段时间了,但是我似乎想起了get()和put()方法是同步的。 JavaDocs没有反映这一点。他们只是说类Hashtable是同步的。我该怎么办?如果多个线程同时访问哈希表(假设它们没有修改同一条目),则操作将成功,对吗?我想我问的是“ java.util.Hashtable线程安全吗?” 请指导我摆脱这个问题… 问题答案: 它是线程安全的
问题内容: 我在JBoss 7中部署的Java EE应用程序中使用PostgreSQL 9.1 JDBC4驱动程序(postgresql-9.1-902.jdbc4.jar)。 我可以假设 javax.sql.DataSource 是线程安全的,以便多个线程可以同时调用getConnection()方法吗? 问题答案: javax.sql.DataSource本身是一个接口,因此无论线程安全与否,
问题内容: 是线程安全的?也就是说,在初始化它之后,是否可以依赖访问下一个随机数来保证线程安全?检查源代码似乎表明事实确实如此,并且此错误报告似乎表明它缺乏作为线程安全的文档是javadoc的问题。有没有人确认它实际上是线程安全的? 问题答案: 是的。它扩展了,始终具有 事实上的 线程安全实现,并且从Java 7开始,它明确地保证了线程安全。 如果许多线程使用单个,则可能存在争用,从而影响性能。另