bra*_*boy 2 java multithreading
我对多线程存在疑问,在许多采访中我遇到了很多关于多线程的问题.
我说了很多关于获取对象的锁定.我怀疑的是,当你有两个同步的方法,并且有两个线程想要访问这两个方法时,ThreadA想要访问MethodA而ThreadB想要访问MethodB.
现在两个方法都在同一个对象中.但我习惯说获取一个对象的锁定,我没有听说获取锁定方法.现在两个线程可以并行访问MethodA和MethodB吗?我的假设是,一旦你获得了对象的锁定,没有其他线程可以处理它.不是吗?
什么是同步的重要性(XYZ.class)?
不,他们不能.如果我理解正确,那么你的意思是:
class Foo {
public synchronized void methodA () {
doSmth ();
}
public synchronized void methodB () {
doSmthElse ();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,synchronized修饰符等于:
class Foo {
public void methodA () {
synchronized (this) {
doSmth ();
}
}
public void methodB () {
synchronized (this) {
doSmthElse ();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着每个Foo对象中只有一个线程可以在这两个方法中的一个内同时工作.
什么是同步的重要性(XYZ.class)?
这就是你幕后的幕后故事
class XYZ {
public static synchronized void someMethod () { ... }
}
Run Code Online (Sandbox Code Playgroud)
将方法声明为synchronized会与在"synchronized(this){...}"块中包含整个方法主体基本相同.因此,对同步方法的锁定在整个对象实例上,这意味着您将锁定其他想要在同一对象上使用同步方法的人.如果您希望每个方法同步而不是每个对象同步,则必须通过在该特定方法中使用synchronized(guardObject)或使用java中的一个Lock对象(大多数在1.5中添加)来同步其他内容.
什么是同步的重要性(XYZ.class)?
这意味着您正在使用该类作为保护对象,这意味着类本身(而不是实例)中的锁将保护对该块的访问.将对象实例用作保护的区别在于,如果您有一万个对象,则一次只能访问其中一个对象,而一次保护多个线程对一个实例的访问.
| 归档时间: |
|
| 查看次数: |
282 次 |
| 最近记录: |