作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我最近的采访中,通过解释一种情况,他们询问进程是否是线程安全的
有两种同步方法,一种是静态的,另一种不是静态的,即非静态方法 A 和静态方法 B。这两种方法访问共享数据。
现在线程 A 调用非静态方法 A,线程 B 调用静态方法 B。这个线程安全吗?请解释一下?
最佳答案
不,它不是线程安全的。为了使其成为线程安全的,不同的线程必须使用相同的锁访问共享数据,但是这两种方法使用不同的锁。将 synchronized 放在静态方法上使用类作为锁,将 synchronized 放在实例方法上使用对象作为锁。
如果线程使用不同的锁,则两个线程都不会被阻塞,并且都可以并发访问或修改数据。即使线程只是访问数据而不修改数据,锁定也可以确保内存可见性。没有共享锁,您就不能依赖这种可见性。仅当数据不可变且已经是 safely published 时,不受限制的并发访问才是安全的.
假设共享数据必须是可变的,解决方法是两种方法都使用相同的锁。如果您使用同步块(synchronized block)(而不是将同步添加到方法中),您始终可以指定自己的锁,因此实例方法可以使用:
public void yourInstanceMethod() {
synchronized(WhateverYourClassIs.class) {
// code accessing shared data
}
}
关于java - 进程线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406811/
我是一名优秀的程序员,十分优秀!