What is synchronized statement used for?

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-30 09:05:14

问题


What is the usage of synchronized statements?


回答1:


It is a java built in form of mutual exclusion. This is used for multithreaded applications.

Sun concurrency tutorial

This has a section about synchronized, but you should read the whole thing if you are trying to use multithreaded applications.

Wiki mutex




回答2:


These are used for when you are building a program with many "threads". When main starts, it starts with one thread, which executes the steps in a sequence. You can start many more threads, which can then execute code at the same time. If you're executing the same code at the same time, things might behave in ways you don't want:

y = x+20;
// at this moment, before the next instruction starts, some other thread performs 
// the above step, which sets 'y' (an object property) to something different.
int b = y+10; // this would not be x+20, as you might expect.

What you want to do is put a 'lock' over this block of code, to make sure that no other thread can start executing any code that is "synchronized on" the variable y.

synchronized (y) {
    y = x+20;
    int b = y+10;
} // lock gets released here

Now, all other threads have to wait for whichever thread got there first to exit the block and release the lock, at which point another thread grabs the lock, enters the block of code, executes it, and releases the lock. Note that y has to be an object (Integer), not a primitive type.

You can also add 'synchronized' to methods, which synchronizes on 'this' (the instance object), or the class in the case of a static method.

Writing multi-threaded code is hard, because of problems like this. Synchronization is one tool, though it has one major problem - deadlocks. There is a lot of information online about deadlocks.




回答3:


It creates a section of code which, with respect to two or more threads, can (a) only be executed by one thread at a time, and (b) forms a memory barrier.

While understanding the concept of mutual-exclusion preventing concurrent execution of the code is quite easy, equally important is the memory barrier.

A memory barrier forms a "happens before" relationship between two threads. Any changes to memory made by a thread before acquiring a lock is guaranteed to be observed by another thread after it acquires the same lock. Due to the effects of CPU caches and their interaction with main memory, this is critical to preventing observation and update of stale cached memory and preventing race conditions between threads.




回答4:


Only 1 thread at a time can access a synchronized block.

This is a basic language construct. If you're not at all familiar with it you'll need to review.




回答5:


Invoking a synchronized instance method of an object acquires a lock on the object, and invoking a synchronized static method of a class acquires a lock on the class. A synchronized statement can be used to acquire a lock on any object, not just this object, when executing a block of the code in a method. This block is referred to as a synchronized block. The general form of a synchronized statement is as follows:   synchronized (expr) { statements; }   The expression expr must evaluate to an object reference. If the object is already locked by another thread, the thread is blocked until the lock is released. When a lock is obtained on the object, the statements in the synchronized block are executed, and then the lock is released.



来源:https://stackoverflow.com/questions/1268016/what-is-synchronized-statement-used-for

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!