在C#中,当我这样做时
lock(this)
{
//do something
}
它的缩写:
Monitor.Enter(this);
try
{
//do something
}
finally
{
Monitor.Exit(this);
}
Java怎么样?是
synchronized(this) {
//do something
}
某事还缺?是否还有一些与java中的System.Threading.Monitor类相同的东西?
答案 0 :(得分:1)
在Java中有:
synchronized
块:
synchronized(this) {
//do something
}
synchronized
方法:
public synchronized void someMethod() {
//do something
}
每个对象都有的方法wait()
,notify()
和notifyAll()
。当线程拥有此对象的监视器(换句话说,来自同步方法或块)时,必须调用它们:
public synchronized void waitForOtherTHreadToSetTheCondition() {
while(!condition) {
try {
wait();
} catch (InterruptedException e) {}
}
}
public synchronized setCondition() {
condition = true;
notifyAll();
}
Lock接口及其子类:
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}
java.util.concurrent
包中的许多其他有用课程,例如Semaphore,SynchronousQueue,CountDownLatch
回答你的问题" synchronized
也是速记吗?"
没有。 Java中没有System.Threading.Monitor
的等价物。
答案 1 :(得分:1)
与.NET不同,Java的监视器锁是使用字节码指令而不是API实现的。你会在.NET IL中看到对Monitor.[Try]Enter
或Monitor.Exit
的调用,而是在Java字节码中看到monitorenter
或monitorexit
指令(同样用try / finally保护) )。
以编程方式使用内置监视器锁定的唯一方法是使用synchronized
关键字或sun.misc.Unsafe
,monitorEnter
和monitorExit
方法。但是,Unsafe
是一个不可移植的内部Oracle API,计划在将来的JDK中删除它。非常不鼓励使用它。
答案 2 :(得分:0)
public void lock()
获取锁定。
public void unlock()
尝试释放此锁定。
示例代码:
class X {
ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
assert !lock.isHeldByCurrentThread();
lock.lock();
try {
// ... method body
} finally {
lock.unlock();
}
}
}
主要不同:您通过将对象传递给static
类来调用Monitor
方法。在Java中,您必须在实例(ReentrantLock
或Object
)上执行方法,因此不需要传递对象。
将c#中的Monitor
映射到java中的Lock
类
Enter(this) => lock()
Exit(Object) => unlock()
TryEnter(Object) => tryLock()
TryEnter(Object, TimeSpan) => tryLock(long timeout, TimeUnit unit)
将c#中的Monitor
映射到java中的Object
类
Wait(Object) => wait()
Pulse(object obj) => notify()
PulseAll(Object) => nofityAll()
关于其他查询:
synchronized(this) {
//do something
}
类似但不一样。
相关问题:Why use a ReentrantLock if one can use synchronized(this)?