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
的实现,因为它会锁定this
或typeof(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如何将正确的任务分配给正确的线程? 参考方案 …