java语法:";已同步(此)“;

java语法:";已同步(此)“;,java,syntax,synchronized,Java,Syntax,Synchronized,你能给我解释一下这段java代码吗?我不能理解这个语法 synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (Exception e) { } } 这意味着此代码块是同步的,这意味着不能有多个线程访问该块中的代码 另外这意味着您可以在当前实例上进行同步(在当前实例上获得

你能给我解释一下这段java代码吗?我不能理解这个语法

synchronized (this) {
              try {
                  wait(endTime - System.currentTimeMillis());
              } catch (Exception e) {
              }
}

这意味着此代码块是同步的,这意味着不能有多个线程访问该块中的代码

另外
这意味着您可以在当前实例上进行同步(在当前实例上获得锁)

这是我在Kathy Sierra的java认证书中发现的

因为同步会影响并发性,所以您不想同步 保护数据所需的任何代码。所以如果一个方法的范围是 除了所需之外,您还可以将同步部分的范围缩小到其他方面 不到一个完整的方法,只需要一个块

请查看以下代码段:

public synchronized void doStuff() {
    System.out.println("synchronized");
}
可以将其更改为:

public void doStuff() {
   //do some stuff for which you do not require synchronization
   synchronized(this) {
     System.out.println("synchronized");
     // perform stuff for which you require synchronization
   }
}
在第二个代码段中,同步锁仅应用于该代码块,而不是整个方法

synchronized (this)
是实现块级同步的语法。

这意味着在
上,只有这个
对象,并且一次只有一个线程可以执行封闭的块

请查看此处以获得更详细的答案:

它被称为synchronized块,它可以选择在哪个对象上进行同步。同步方法只能使用“this”(或同步类方法的相应类实例)
看这些链接可能会给你更好的答案

  • 同步(this)-我们得到一个与指向“this”的对象关联的锁。当我们使用这个块时,我们的意思是我们愿意等待,直到使用这个监视器的线程释放它。如果更改数据对象(对象的变量),则使用锁是有意义的


    wait-使当前执行的线程等待,直到另一个线程调用notify方法或等待指定的持续时间。

    此第一行控制对封闭代码块的并发访问。一次只能有一个线程执行代码块。有关详细信息,请参阅的第2.2节

    synchronized (this) {
    
    下面附带的代码块似乎使用了一种(非常糟糕的)方法,将执行线程暂停一段给定的时间

        try {
            wait(endTime - System.currentTimeMillis());
        } catch (Exception e) {
        }
    

    此外,它正在“吞咽”在等待过程中可能抛出的任何异常,这确实非常顽皮。

    在大多数情况下,一次只有一个线程可以访问“Synchronized(this)”。但这并不总是正确的!!考虑下面的代码。在我的代码中,我将静态对象作为锁进行同步,一切正常。当我将代码更改为同步时,多个线程同时访问代码,这会把一切都搞糟。小心(这个)。注意:代码递归地创建线程,然后以相反的顺序显示它们

    主要
    公共类项目2
    {
    公共静态void main(字符串[]args)引发InterruptedException
    {
    对象锁=新对象();
    螺纹2 t1=新螺纹2(1);
    t1.设置名称(“线程1”);
    t1.start();
    螺纹2.que.add(t1);
    t1.join();
    } 
    }
    
    螺纹2
    公共类Threads2扩展线程
    {
    //private final ArrayBlockingQueue que=新的ArrayBlockingQueue(5);
    公共静态ArrayList que=新ArrayList(5);
    个人信息;
    private static volatile boolean locked=true;
    私有静态最终对象锁=新对象();
    公共线程2(int i)
    {        
    这个。i=i;
    }
    @凌驾
    公开募捐
    {   
    尝试
    {
    System.out.println(“线程”+i+“:已创建”);
    已同步(锁定)
    {
    i++;
    }       
    如果(i=0)
    {
    que.get(i-2.interrupt();
    我--;
    System.out.println(Thread.currentThread().getName());
    }    
    }       
    }       
    }    
    }
    
    由于没有共享锁,因此在此中断同步。是否有人修复了此代码?我没有看到同步(这个),代码似乎工作正常
        try {
            wait(endTime - System.currentTimeMillis());
        } catch (Exception e) {
        }