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