Java 同步块内部运行方法
如果我有下面这样的东西,那么在Java 同步块内部运行方法,java,multithreading,Java,Multithreading,如果我有下面这样的东西,那么在同步块中这意味着什么 synchronised (syncObject) { 基本上,这意味着上述块中只能有一个线程,一旦一个线程完成执行,第二个线程将进入同步块synchronized(syncObject)。对吗? 有谁能用外行的语言给我解释一下,好让我了解更多的情况吗 private static final class Task implements Runnable { { private static Object syncObject = new
同步块中这意味着什么
synchronised (syncObject) {
基本上,这意味着上述块中只能有一个线程,一旦一个线程完成执行,第二个线程将进入同步块synchronized(syncObject)。对吗?
有谁能用外行的语言给我解释一下,好让我了解更多的情况吗
private static final class Task implements Runnable {
{
private static Object syncObject = new Object();
public Task(Command command, BlockingQueue<Integer> pool1, BlockingQueue<Integer> pool2) {
this.command = command;
this.existPool = pool1;
this.newPool = pool2;
}
public void run()
{
synchronised (syncObject) {
if() {
existId = existPool.take();
attributeMethod(existId);
} else if() {
newId = newPool.take();
attributeMethod(newId);
}
}
}
}
// So I need to make this method synchronized or not? Currently I have made this synchronized
private synchronized void attributeMethod(int range) {
// And suppose If I am calling any other method here-
sampleMethod();
}
// What about this method, I need to make this synchronized as well? or not?
private synchronized void sampleMethod() {
}
私有静态最终类任务实现可运行{
{
私有静态对象syncObject=新对象();
公共任务(命令命令、阻塞队列池1、阻塞队列池2){
this.command=命令;
this.existPool=pool1;
this.newPool=pool2;
}
公开募捐
{
已同步(同步对象){
if(){
existId=existPool.take();
属性方法(existId);
}else if(){
newId=newPool.take();
属性法(newId);
}
}
}
}
//所以我需要使这个方法同步还是不同步?目前我已经使这个方法同步了
私有同步无效属性方法(整数范围){
//假设我在这里调用任何其他方法-
抽样方法();
}
//这个方法怎么样,我也需要使它同步?还是不同步?
私有同步的void sampleMethod(){
}
否,attributeMethod
已在synchronized
块的范围内运行;无需将其标记为这样,除非您打算在该块之外同时调用它
基本上,这意味着只有一个线程可以在上面的块中,并且一旦一个线程完成执行,第二个线程将进入同步的块(syncObject)。对吗
对!
所以我需要使这个方法同步还是不同步
不可以。假设只从run()
方法中的synchronized块中调用该方法,该块将阻止多个线程同时执行该方法。因此,将该方法声明为synchronized
是多余的
不过,我要指出一些事情:
- 当您将一个实例方法声明为“已同步”
时,它将在此
上同步;即在任务
对象上同步。但是您的已同步
块正在另一个对象上同步。同步对象
中的对象。在这种情况下,这并不重要。但是,如果已同步run()
方法中的code>block不存在,您会发现线程正在尝试在不同的对象上进行同步…并且不会得到互斥
通过在run()
方法的顶层同步…对执行该任务的所有线程使用单个共享的syncObject
,可以有效地使任务一次运行一个。这完全否定了使用线程的任何好处
将包含私有锁对象(如syncObject
)的变量声明为final
,这是一种很好的做法。这样可以避免某些内容可能会覆盖它……从而导致同步失败
谢谢Joao的建议,那么我的第一个问题呢?基本上,这意味着只有一个线程可以在该块内,并且一旦一个线程完成执行,第二个线程将进入该同步块。对吗?
我说得对吗?在一个线程完成该块的执行后,只有第二个线程将进入该块进入右侧?对于我的第二个问题,我可以在块synchronized(syncObject)中使用多个方法,而不使用synchronized关键字{
对吗?所以只有一个线程在该块中,当第一个线程完成执行后,第二个线程将进入该块并执行该同步块中的所有方法,对吗?是的,一次只能有一个线程进入一个同步的
块,所有其他线程将暂停,直到第一个线程已经完成。谢谢Joao,我刚刚用一个额外的问题更新了我的问题,这是我想问的。假设我有另一个方法sampleMethod
,那么sampleMethod
也不会被同步,对吗?正如你所说,它将在同步块的范围内?事实上,有多少调用hie并不重要rarchies你补充说,当其他线程到达synchronized
块时,它们将暂停执行,syncObject
当前被另一个线程锁定。感谢Stephen,非常感谢你帮助我理解这些简单的东西。我刚刚发布了与上面类似的内容,但正如你在seocnd poi中所说的如果我把synchronize放在run()方法的顶层,我就否定了线程的好处。因此,这就是我想改变逻辑,看看我是否正确的原因。请注意,还有一个答案,。(请参阅右侧的绿色突出显示)