Java 使用同步锁(obj)和声明锁之间的区别

Java 使用同步锁(obj)和声明锁之间的区别,java,multithreading,object,synchronization,locking,Java,Multithreading,Object,Synchronization,Locking,我正在尝试同步此run()方法。我希望一次只进入一个线程,但我不明白为什么解决方案告诉我使用同步(obj)方法: public Tabellina(Contatore o, int num) { obj = o; numero = num; r = new Random(); start(); } public void run() { synchronized(obj) { for (int j=0; j<10; j++) {

我正在尝试同步此run()方法。我希望一次只进入一个线程,但我不明白为什么解决方案告诉我使用同步(obj)方法:

public Tabellina(Contatore o, int num) {
    obj = o; 
    numero = num;
    r = new Random(); 
    start();
}

public void run() {
    synchronized(obj) {
        for (int j=0; j<10; j++) {
            obj.incr();
            try { 
                Thread.sleep(100);
            } catch (InterruptedException e) { }
            System.out.println(Thread.currentThread().getName() + ": " + obj.getVal());
        }
        try { 
            Thread.sleep(r.nextInt(2000));
        } catch (InterruptedException e) { }
    }}
}
public Tabellina(Contatore o,int num){
obj=o;
numeo=num;
r=新随机数();
start();
}
公开募捐{
同步(obj){
对于(int j=0;j使用

是的缩写

public void run() {
    synchronized (this) {

由于
这个
对于每个具有锁的对象都是不同的,它们彼此独立。换句话说,它在您的情况下没有任何作用。

我认为您创建了两个独立的锁。我假设所有线程的“Contatore o”都是相同的。但是,您有不同的“l1”对于每个线程,因此锁不起作用。对所有线程使用一个锁对象。(可能)因为您通过(一个/相同)Cantatore同步(多个)线程…但使用单个锁…(每个线程都有自己的锁…:)…当您使用“共享锁”时,您将得到相同的结果!(您应该使锁成为静态的,或者也可以通过构造函数传递)
public synchronized void run() {
public void run() {
    synchronized (this) {