什么是C#的Monitor类的java等价网络?

时间:2018-02-19 00:09:37

标签: java c# multithreading concurrency thread-safety

在C#中,当我这样做时

lock(this)
{
    //do something
}

它的缩写:

Monitor.Enter(this);
try
{
    //do something
}
finally
{
    Monitor.Exit(this);
}

Java怎么样?是

synchronized(this) {
    //do something
}
某事还缺?是否还有一些与java中的System.Threading.Monitor类相同的东西?

3 个答案:

答案 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包中的许多其他有用课程,例如SemaphoreSynchronousQueueCountDownLatch

回答你的问题" synchronized也是速记吗?"

没有。 Java中没有System.Threading.Monitor的等价物。

答案 1 :(得分:1)

与.NET不同,Java的监视器锁是使用字节码指令而不是API实现的。你会在.NET IL中看到对Monitor.[Try]EnterMonitor.Exit的调用,而是在Java字节码中看到monitorentermonitorexit指令(同样用try / finally保护) )。

以编程方式使用内置监视器锁定的唯一方法是使用synchronized关键字或sun.misc.UnsafemonitorEntermonitorExit方法。但是,Unsafe是一个不可移植的内部Oracle API,计划在将来的JDK中删除它。非常不鼓励使用它。

答案 2 :(得分:0)

您可以在LockObject

中找到相应的API
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中,您必须在实例(ReentrantLockObject)上执行方法,因此不需要传递对象。

将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)?