非同步方法可以通过其他线程访问,,,,,,,

时间:2015-08-30 06:50:27

标签: java multithreading

由一个线程锁定一个对象,没有其他线程可以进入该类中的任何同步方法,但我想知道非同步方法可以通过其他线程访问,,,,,,,

class Account {

    private int balance = 50;

    public int getBalance() {
        return balance;
    }

    public void withdraw(int amount) {
        balance = balance - amount;
    }
}

public class AccountDanger implements Runnable {

    private Account acct = new Account();

    public void run() {
        for (int x = 0; x < 5; x++) {
             this. d();
            makeWithdrawal(10);

            if (acct.getBalance() < 0) {
                System.out.println("account is overdrawn!");
            }
        }
    }

    private synchronized void  makeWithdrawal(int amt) {
        if (acct.getBalance() >= amt) {
            System.out.println(Thread.currentThread().getName()
                    + " is going to withdraw"+amt);
            try {
                Thread.sleep(500);
               // Thread.sleep(500);

            } catch (InterruptedException ex) {
            }
            acct.withdraw(amt);
            System.out.println(Thread.currentThread().getName()
                    + " completes the withdrawal"+acct.getBalance());
        } else {
            System.out.println("Not enough in account for " + Thread.currentThread().getName()
                    + " to withdraw " + acct.getBalance());
        }
    }

    public static void main(String[] args) {
        AccountDanger r = new AccountDanger();
        Thread one = new Thread(r);
        Thread two = new Thread(r);
        one.setName("Fred");
        two.setName("Lucy");
        one.start();
        two.start();
    }

    private void d() {
        System.out.println("hhhhhhhhhhhhhhhhhhhhh"+Thread.currentThread().getName());
    }

}

2 个答案:

答案 0 :(得分:0)

你自己的问题答案:)。如果您只是在寻找确认:是。

访问对象的非同步方法不需要锁定。

如果您想了解有关这些概念的更多信息,请访问Object Locks

答案 1 :(得分:0)

是的,任何具有/获取对同一实例的引用的线程都可以访问/调用非同步方法。由于您创建了一个私有Account实例,并且您没有将此实例提供给任何其他类,因此在您的示例中没有其他线程能够访问此特殊实例。