Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步块内部运行方法_Java_Multithreading - Fatal编程技术网

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()方法的顶层,我就否定了线程的好处。因此,这就是我想改变逻辑,看看我是否正确的原因。请注意,还有一个答案,。(请参阅右侧的绿色突出显示)