JavaSE进阶

15.4.5 练 习1

银行有一个账户。

有两个储户分别向同一个账户存3000元,每次存1000,存3次。每次存完打印账户余额。

【问题】:该程序是否有安全问题,如果有,如何解决?

【提示】

1,明确哪些代码是多线程运行代码,须写入run()方法

2,明确什么是共享数据。

3,明确多线程运行代码中哪些语句是操作共享数据的。

拓展问题:可否实现两个储户交替存钱的操作

 

15.4.6 小结:释放锁的操作

  • 当前线程的同步方法、同步代码块执行结束
  • 当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。
  • 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束
  • 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。

15.4.7 线程的死锁问题

  • 死锁
    • 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
  • 解决方法
    • 专门的算法、原则
    • 尽量减少同步资源的定义

 

 

public class TestDeadLock {

    public static void main(String[] args) {

        final StringBuffer s1 = new StringBuffer();

        final StringBuffer s2 = new StringBuffer();

        new Thread() {

            public void run() {

                synchronized (s1) {

                    s2.append("A");

                    synchronized (s2) {

                        s2.append("B");

                        System.out.print(s1);

                        System.out.print(s2);

                    }

                }

            }

        }.start();

        new Thread() {

            public void run() {

                synchronized (s2) {

                    s2.append("C");

                    synchronized (s1) {

                        s1.append("D");

                        System.out.print(s2);

                        System.out.print(s1);

                    }

                }

            }

        }.start();

    }

}