同步方法和块之间的区别

时间:2014-07-23 06:03:20

标签: java multithreading

我的问题似乎与堆栈中的其他问题类似,但是我无法理解当在类中有多个方法时我将这两个方法放在synchronized块中并且我试图运行这两个方法是不同的线程,但这里的方法是一个接一个地运行。

主要类

/*
 * 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;
//    }

}

3 个答案:

答案 0 :(得分:1)

这与用于锁定的帐户对象相同

所以一次只能有一个线程锁定它

答案 1 :(得分:1)

要完全回答您的问题,您需要包含“WithDraw”和“BalanceChecfk”类。但是,“帐户”类使用基于实例监视器的同步块,因此如果WithDraw和BalanceChecfk类使用传递给它们的帐户对象委托给Account中的方法,那么首先启动的任何一个将首先完成另一方 - 就像你观察到的那样。如果在同步之前向Account.withDr方法添加两秒钟的睡眠,您可能会看到先执行BalanceChecfk,然后执行WithDraw。

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

private Long penniesInMyAccount

到Account对象,然后您需要从这些方法正确同步对此共享资源的访问。有许多方法可以正确有效地完成这项工作。

完全抛开:

  1. 清楚地命名您的课程和方法;
  2. 不要使用缩写;和,
  3. 使用正确的语法和拼写。
  4. 希望有所帮助。

    记住,“善待你未来的自我。” --Hansen

答案 2 :(得分:0)

没有区别,但是,synchronized块可以灵活地锁定不同的对象,以及同步一个代码块(顾名思义),而不是整个方法。