Questions tagged «synchronization»

同步是指使用控件来维护一个一致的表示形式,或者是一组运行同一程序的进程(进程同步),或者是数据表示形式(数据同步)。

8
锁到底如何工作?
我看到对于使用不是线程安全的对象,我们使用如下锁将代码包装起来: private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } 因此,当多个线程访问同一代码时会发生什么(假设它在ASP.NET Web应用程序中运行)。他们排队了吗?如果是这样,他们将等待多长时间? 使用锁会对性能产生什么影响?

22
避免在Java中同步(this)?
每当关于Java同步的问题浮出水面时,有些人就会很想指出synchronized(this)应该避免的事情。他们声称,取而代之的是,最好是锁定私有引用。 给出的一些原因是: 一些邪恶的代码可能会窃取您的锁(非常流行,也有一个“偶然的”变体) 同一类中的所有同步方法都使用完全相同的锁,这会降低吞吐量 您(不必要地)暴露了太多信息 包括我在内的其他人则认为,这synchronized(this)是一个惯用语言(在Java库中也是如此),是安全且易于理解的。应当避免这种情况,因为您有一个错误,而且对多线程程序中正在发生的事情一无所知。换句话说:如果适用,请使用它。 我对看到一些真实的示例(没有foobar的东西)感兴趣,在这种情况下,避免锁定this也更可取synchronized(this)。 因此:您是否应该始终避免synchronized(this)使用私有引用锁定并将其替换? 一些进一步的信息(根据给出的答案进行更新): 我们正在谈论实例同步 的隐式(synchronized方法)和显式形式synchronized(this)都被考虑 如果您引用Bloch或有关该主题的其他权威,请不要遗漏您不喜欢的部分(例如,Effective Java,Thread Safety上的项目:通常是实例本身的锁,但也有例外)。 如果您需要锁定而不是synchronized(this)提供粒度,synchronized(this)则不适用,所以这不是问题

5
Java同步关键字的C#版本?
c#是否具有自己的java“ synchronized”关键字版本? 即在Java中,可以将其指定为函数,对象或代码块,如下所示: public synchronized void doImportantStuff() { // dangerous code goes here. } 要么 public void doImportantStuff() { // trivial stuff synchronized(someLock) { // dangerous code goes here. } }

7
atomic / volatile / synchronized有什么区别?
原子/易失性/同步在内部如何工作? 以下代码块之间有什么区别? 代码1 private int counter; public int getNextUniqueIndex() { return counter++; } 代码2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } 代码3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } 是否volatile以以下方式工作?是 volatile int i = 0; void incIBy5() { i += 5; } 相当于 …


5
在Objective-C中如何@synchronized锁定/解锁?
@synchronized是否不使用“锁定”和“解锁”来实现互斥?那么它如何锁定/解锁? 以下程序的输出仅是“ Hello World”。 @interface MyLock: NSLock<NSLocking> @end @implementation MyLock - (id)init { return [super init]; } - (void)lock { NSLog(@"before lock"); [super lock]; NSLog(@"after lock"); } - (void)unlock { NSLog(@"before unlock"); [super unlock]; NSLog(@"after unlock"); } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool …

10
同步与锁定
java.util.concurrentAPI提供了一个名为的类Lock,该类将基本上对控件进行序列化以访问关键资源。它给出了诸如park()和的方法unpark()。 如果我们可以使用synchronized关键字以及using wait()和notify() notifyAll()方法,我们可以做类似的事情。 我想知道其中哪一个在实践中更好,为什么?

8
同步静态方法如何在Java中工作,我可以使用它来加载Hibernate实体吗?
如果我有一个带有静态方法的util类,它将调用Hibernate函数来完成基本数据访问。我想知道是否使该方法synchronized是确保线程安全的正确方法。 我希望这可以防止对同一数据库实例的信息访问。但是,我现在确定当getObjectById特定类调用以下代码时,是否阻止所有类调用以下代码。 public class Utils { public static synchronized Object getObjectById (Class objclass, Long id) { // call hibernate class Session session = new Configuration().configure().buildSessionFactory().openSession(); Object obj = session.load(objclass, id); session.close(); return obj; } // other static methods }

1
Mutex示例/教程?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使它成为Stack Overflow 的主题。 4个月前关闭。 改善这个问题 我是多线程的新手,并试图了解互斥锁的工作原理。做了很多谷歌搜索,我发现了一个不错的教程,但是它仍然对它的工作方式产生了一些疑问,因为我创建了自己的程序,其中锁不起作用。 互斥锁的一种绝对不直观的语法pthread_mutex_lock( &mutex1 );是,当我真正想要锁定的是其他变量时,它看起来像互斥锁已被锁定。这种语法是否意味着锁定互斥锁会锁定代码区域,直到互斥锁解锁为止?那么线程如何知道该区域已锁定?[ 更新:线程知道该区域已被 Memory Fencing 锁定 ]。难道这种现象不应该称为临界区吗?[ 更新:关键部分对象仅在Windows中可用,其中这些对象比互斥对象快,并且仅对实现该对象的线程可见。否则,关键部分仅指由互斥锁保护的代码区域 ] 简而言之,能否请您提供最简单的互斥体示例程序以及有关其工作原理的最简单的解释?我确信这将对其他许多新手有所帮助。


6
Java静态初始化程序线程安全吗?
我正在使用静态代码块来初始化我拥有的注册表中的某些控制器。因此,我的问题是,我可以保证在首次加载该类时,该静态代码块仅被绝对调用一次吗?我知道我不能保证何时会调用此代码块,我猜是在Classloader首次加载时。我意识到我可以在静态代码块中的类上进行同步,但是我猜这实际上是怎么回事? 简单的代码示例将是; class FooRegistry { static { //this code must only ever be called once addController(new FooControllerImpl()); } private static void addController(IFooController controller) { // ... } } 还是我应该这样做; class FooRegistry { static { synchronized(FooRegistry.class) { addController(new FooControllerImpl()); } } private static void addController(IFooController controller) { // ... } }

10
C ++ 0x没有信号量?如何同步线程?
C ++ 0x会没有信号量是真的吗?关于信号量的使用,在堆栈溢出方面已经存在一些问题。我一直使用它们(posix信号量)让一个线程在另一个线程中等待某个事件: void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... } 如果我要用互斥锁来做到这一点: void thread0(...) { doSomething0(); event1.lock(); event1.unlock(); ... } void thread1(...) { event1.lock(); doSomethingth1(); event1.unlock(); ... } 问题:这很丑陋,不能保证thread1首先锁定互斥锁(鉴于同一线程应该锁定和解锁互斥锁,因此您也不能在thread0和thread1启动之前锁定event1)。 因此,由于boost也没有信号量,实现以上目标的最简单方法是什么?


5
如何在Java中运行类的不同实例的线程之间同步静态变量?
我知道synchronize在方法带来同步到该对象之前使用关键字。也就是说,运行对象的同一实例的2个线程将被同步。 但是,由于同步是在对象级别进行的,因此运行对象的不同实例的2个线程将不会同步。如果在Java类中有一个由该方法调用的静态变量,则希望在类的各个实例之间进行同步。这两个实例在2个不同的线程中运行。 我们可以通过以下方式实现同​​步吗? public class Test { private static int count = 0; private static final Object lock= new Object(); public synchronized void foo() { synchronized(lock) { count++; } } } 确实如此,因为我们已经定义了一个lock静态对象,并且正在使用该synchronized锁的关键字,所以static变量count现在可以在class实例之间进行同步Test?

8
Java Singleton和同步
请阐明有关单例和多线程的查询: 在多线程环境中用Java实现Singleton的最佳方法是什么? 当多个线程尝试同时访问getInstance() 方法时会发生什么? 我们可以做单身的吗 getInstance() synchronized吗? 使用Singleton类时,真的需要同步吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.