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);
}