Java与C#开发上的一些差异与转换方法(4)

Java和C#在多线程管理上的差异性与转换:

C#中使用MethodImplOptions.Synchronized进行线程同步

[MethodImpl(MethodImplOptions.Synchronized)]
public void test(){

}


大体等于Java中

public synchronized void test(){

}

C#中使用lock关键字作为互斥锁

object o = new object();

public void test(){
   lock(o){
   
   }
}


大体等于Java中

Object o = new Object();

public void test(){
   synchronized(o){
   
   }
}


C#中使用Monitor.Enter作为排他锁

List<object> list = new List<object>();

public void test()
{
    Monitor.Enter(list);
    //具体的list排它操作
    //......
    Monitor.Exit(list);
}

在Java中没有等价存在,不过有一些功能近似类在java.util.concurrent.locks包下可供调配,比如写成这样:

    ReentrantReadWriteLock ilock = new ReentrantReadWriteLock();

    Lock readLock = ilock.readLock();

    Lock writeLock = ilock.writeLock();

    List<Object> list = new ArrayList<Object>();

    public void test() {
        try {
            // 读取锁定
            readLock.lock();
            // 写入解锁
            writeLock.unlock();
            // 具体的list排它操作
            // ......
        } finally {
            // 读取解锁
            readLock.unlock();
            // 写入锁定
            writeLock.lock();
        }
    }


其它C#多线程常用函数与Java间函数的关系,可参见如下实现(也可参考LGame的C#版JavaRuntime类中):

public static void Wait(object o)
        {
            Monitor.Wait(o);
        }

public static void Wait(object o, long milis)
        {
            Monitor.Wait(o, (int)milis);
        }

public static void Wait(object o, TimeSpan t)
        {
            Monitor.Wait(o, t);
        }

public static void NotifyAll(object o)
        {
            Monitor.PulseAll(o);
        }

public static void Notify(object o)
        {
            Monitor.Pulse(o);
        }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pfsfz.html