Java同步关键字的C#版本? - c#

c#是否具有自己的java“ synchronized”关键字版本?

即在Java中,可以将其指定为函数,对象或代码块,如下所示:

public synchronized void doImportantStuff() {
   // dangerous code goes here.
}

要么

public void doImportantStuff() {
   // trivial stuff

   synchronized(someLock) {
      // dangerous code goes here.
   }
}

参考方案

首先-大多数类将永远不需要是线程安全的。使用YAGNI:仅当您知道实际使用线程安全(并对其进行测试)时,才应用线程安全。

对于方法级的东西,有[MethodImpl]

[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}

这也可以用于访问器(属性和事件):

private int i;
public int SomeProperty
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    get { return i; }
    [MethodImpl(MethodImplOptions.Synchronized)]
    set { i = value; }
}

请注意,默认情况下,类似字段的事件是同步的,而自动实现的属性则不是:

public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized

就个人而言,我不喜欢MethodImpl的实现,因为它会锁定thistypeof(Foo)-这违反了最佳实践。首选选项是使用自己的锁:

private readonly object syncLock = new object();
public void SomeMethod() {
    lock(syncLock) { /* code */ }
}

注意,对于类似字段的事件,锁定实现取决于编译器。在较早的Microsoft编译器中,它是lock(this) / lock(Type)-但是,in more recent compilers it uses Interlocked更新-线程安全,没有讨厌的部分。

这允许更精细的使用,并允许使用Monitor.Wait / Monitor.Pulse等在线程之间进行通信。

一个相关的blog entry(后来的revisited)。

Java-同步无助于互斥 - java

我有一个程序,其中Main类将创建几个Node类资源,其中包含一个可运行线程,该线程在创建Node类资源时执行。我有一个Receive类使用的共享资源Node类。但是当几个Node资源从Resource类到达同步方法rcv()时,程序没有考虑互斥,并且输出是来自不同Node类不同部分的汞合金public class Main { //field //meth…

Java在一个实例中两个同步方法 - java

考虑以下代码:public class SynchronizedCounter extends Thread { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public void …

我的java线程占用多少内存? - java

有没有办法找出我的Java线程在虚拟机中占用多少内存?例如,使用堆栈跟踪转储或其他某种方式。谢谢 参考方案 Java线程将堆用作共享内存。各个线程都有其堆栈(可以通过-Xss命令行选项设置大小,默认为512KB),但是所有其他内存(堆)都不属于特定线程,并询问一个特定线程使用了多少内存根本没有道理。

如何从线程返回值(java) - java

我做了这样的一个波纹管:public class MyThread implements Runnable { private int temp; public MyThread(int temp){ this.temp=temp; } @Override public void run() { temp+=10; return; } public int …

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …