Java 同步方法和块之间的差异

Java 同步方法和块之间的差异,java,multithreading,Java,Multithreading,我的问题似乎与stack over flow中的其他问题类似,但我无法理解,当类中有多个方法时,我将两个方法都放在同步块中,并且我尝试运行这两个方法是不同的线程,但这里的方法是一个接一个地运行的 主类 /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and o

我的问题似乎与stack over flow中的其他问题类似,但我无法理解,当类中有多个方法时,我将两个方法都放在同步块中,并且我尝试运行这两个方法是不同的线程,但这里的方法是一个接一个地运行的

主类

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Login.Package;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;

/**
 *
 * @author ranjeeth.g
 */
public class TransportDataTransper {

    public static void main(String[] args) {
        Account a = new Account();
        Thread t = new Thread(new WithDraw(a));
        t.start();
        Thread b = new Thread(new BalanceChecfk(a));
        b.start();
//        Thread t1 = new Thread(new WithDraw(a));
//        t1.start();

//        t.start();
//        t.start();
    }

}
帐户类

public class Account {

    public double withDr() {
        synchronized (this) {
            System.out.println("with draw check method = ");
            for (int i = 0; i < 50; i++) {
                System.out.println("i = " + i);
            }
            return 0;
        }
    }

    public double balacheck() {
        synchronized (this) {
            System.out.println("Balance check method = ");
            for (int i = 0; i < 50; i++) {
                System.out.println("i = " + i);
            }
            return 0;
        }
    }
//    public synchronized double deposit(double amount) {
//        return 0;
//    }

}
公共类帐户{
公共双保险{
已同步(此){
System.out.println(“使用绘图检查方法=”);
对于(int i=0;i<50;i++){
System.out.println(“i=“+i”);
}
返回0;
}
}
公共双重检查(){
已同步(此){
System.out.println(“余额检查方法=”);
对于(int i=0;i<50;i++){
System.out.println(“i=“+i”);
}
返回0;
}
}
//公共同步双倍存款(双倍金额){
//返回0;
//    }
}

这是用于锁定的同一帐户对象a


因此一次只有一个线程可以锁定它

要完全回答您的问题,您需要包含“draw”和“BalanceChecfk”类。但是,“Account”类使用基于实例监视器的同步块,因此,如果Draw和BalanceChecfk类使用传递给它们的Account对象来委托给Account中的方法,那么无论哪个先启动,都将先完成,然后再完成—正如您所观察到的。如果在同步之前向Account.withDr方法添加两秒钟的睡眠时间,则可能会看到首先执行BalanceChecfk,然后执行Draw

奇怪的是,在Account对象实现中没有需要保护的共享资源,所以从技术上讲,根本不需要同步,就像当前实现的那样。但是,如果您添加了

MyAccount中的私人长便士

对于Account对象,则需要从这些方法正确同步对此共享资源的访问。有很多方法可以正确有效地做到这一点

作为一个完整的旁白:

  • 清楚地命名你的类和方法
  • 不要使用缩写;以及
  • 使用正确的语法和拼写
  • 希望有帮助


    记住,“善待你未来的自己”——Hansen没有区别,但是,同步块可以灵活地锁定不同的对象,也可以同步代码块(顾名思义)而不是整个方法。

    如果您询问
    同步的
    方法和
    同步的方法代码(this)
    中包装的方法代码之间是否有差异,则不存在任何可能的重复