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();

    }

}

 

 

 


上一篇:
下一篇:
关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
全国统一咨询电话:010-56253825
地址:北京市昌平区宏福科技园综合楼6层(北京校区)

深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦6层(上海校区)

武汉市东湖高新开发区东湖网谷(武汉校区)