为什么在对象上创建锁,而不是在java中创建代码

为什么在对象上创建锁,而不是在java中创建代码,java,multithreading,Java,Multithreading,我们有以下Java语法 public synchronized void count() { count--; } 这可以像下面这样修改 public void count() { synchronized(this) { count--; } } 我的问题是,为什么我们不能用Java编写如下代码 public void count() { synchronized { count --; } } 事实上,

我们有以下Java语法

public synchronized void count() {
    count--;
}
这可以像下面这样修改

public void count() {
    synchronized(this) {
        count--;
    }
}
我的问题是,为什么我们不能用Java编写如下代码

public void count() {
    synchronized {
        count --;  
    }
}    

事实上,我想了解b/w
synchronized(this)
synchronized(other)

之间的区别,您不能像下面提到的代码那样编写代码

同步块始终用于锁定任何共享资源的对象。 同步块的范围小于该方法。这就是同步块和方法之间的区别

class Table{  

 void printTable(int n){  
   synchronized(this){//synchronized block  
     for(int i=1;i<=5;i++){  
      System.out.println(n*i);  
      try{  
       Thread.sleep(400);  
      }catch(Exception e){System.out.println(e);}  
     }  
   }  
 }//end of the method  
} 
类表{
无效打印表(int n){
已同步(此){//已同步块

对于(inti=1;iYou将不得不询问James Gosling et alIt,这不仅仅是一个观点问题。锁定对象比锁定“代码上”更好,有明确的技术原因。(锁定“代码上”与
静态同步
方法的作用大致相同…)有争议的是>>所有在您的情况下,您应该使用AtomicInteger。对象持有状态,而不是代码,因此无法锁定,即更改代码状态。您可以做的是使
同步{
成为
同步的简称(此){
然而,我想说的是,在调用方可见的对象上进行同步会破坏封装,所以最好不要这样做。你说“同步块总是用于锁定任何共享资源的对象”。为什么?你说在你的示例中,同步块“阻止当前
对象。”如果“blocks”表示“阻止其他线程在同一对象上同步”,那么这是正确的,但是很多新手会读到这一点,认为“blocks”表示“阻止其他线程访问同一对象,“这根本不是真的。一个非常常见的新手错误是,如果一个线程在写入某个对象时同步了该对象,那么其他线程在不同步的情况下访问该对象是安全的。