为什么在对象上创建锁,而不是在java中创建代码
我们有以下Java语法为什么在对象上创建锁,而不是在java中创建代码,java,multithreading,Java,Multithreading,我们有以下Java语法 public synchronized void count() { count--; } 这可以像下面这样修改 public void count() { synchronized(this) { count--; } } 我的问题是,为什么我们不能用Java编写如下代码 public void count() { synchronized { count --; } } 事实上,
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”表示“阻止其他线程访问同一对象,“这根本不是真的。一个非常常见的新手错误是,如果一个线程在写入某个对象时同步了该对象,那么其他线程在不同步的情况下访问该对象是安全的。