201521123061 《Java程序设计》第十一周学习总结

时间:2022-01-11 10:22:59

201521123061 《Java程序设计》第十一周学习总结

1. 本周学习总结

1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。

本周学习的是如何解决多线程访问中的互斥问题和线程间的合作问题

1.当有多个线程对同一个数据进行访问的时候如果不加以控制就会产生“冲突”。解决这种冲突的方法就是互斥访问:在程序代码块前加上synchronized,这样的代码块称为同步代码块。synchronized实现互斥访问主要是靠对象锁来实现的,代码块中每个对象都有一个对象锁,当获得对象锁的时候正常运行,没有获得对象锁则需要等待。

2.对于控制相互交互的线程之间的运行进度的问题可以利用wait()和notify()/notifyAll()方法来协调线程间的运行进度(读取)关系;wait()方法是让当前线程释放其所持有的“对象互斥锁”,进入wait队列(等待队列),notify()/notifyAll()方法的作用是唤醒(任意一个/所有)正在等待队列中等待的线程,并将它(们)移入等待同一个“对象互斥锁”的队列。

2. 书面作业

本次PTA作业题集多线程

1.互斥访问与同步访问

完成题集4-4(互斥访问)与4-5(同步访问)

1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?

还可以使用Condition条件对象来实现互斥同步访问

class Account{
private int balance;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public Account(int balance){ this.balance=balance;
}
void deposit(int money){
try{this.balance+=money;
condition.signal();}
finally{
lock.unlock();}
}
void withdraw(int money){
try{ while(this.balance - money < 0){
condition.await();
condition.signal();
}
this.balance-= money; }catch(Exception e){
System.out.println(e);
}
finally{
lock.unlock();
}
}

1.2 同步代码块与同步方法有何区别?

同步方法是直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,两者的加锁范围不一样,同步方法锁的范围大,同步代码块的范围小。

1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?

  • 实现互斥的原理是对象锁的应用,当一个线程拿到了同步对象锁,就正常运行,此时其他对象就需要在锁池等待队列中等待,当这个线程执行完同步代码后立即把锁还给同步对象其他在锁池中等待的线程的其中一个就可以拿到锁。

      synchronized public  void produce(){
    setCount(getCount()+1);
    }

对于这段生产者的代码,当一个线程拥有了对象锁后将会正常进行加一的操作,此时其他线程处于wait状态,当这段代码执行结束,释放了对象锁,锁池中任意一个线程会抢到对象锁。

  • 过程:多个线程争夺对象锁->其中一个线程得到对象锁其他线程在锁池中等待->执行代码->释放对象锁

1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?

  • 通过wait(),notify()进行通信
  • 如果不放在synchronized方法或代码块中不会产生同步冲突,例如多个对象同时对i++,最后i的结果肯定不是大家所想看到的

2.交替执行

实验总结

  • 主要难点有两个一个是用split将字符串进行分隔放进数组
  • 另一个就是定义了一个flag,根据flag为true或false进行任务的交替执行

3.互斥访问

3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)

201521123061 《Java程序设计》第十一周学习总结

201521123061 《Java程序设计》第十一周学习总结

3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)

参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

由于是批量进行任务执行所以选择invokeAll与invokeAny方法:

201521123061 《Java程序设计》第十一周学习总结

201521123061 《Java程序设计》第十一周学习总结

4.线程间的合作:生产者消费者问题

4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?

多次运行后发现结果不正常,并不是每次仓库都剩零个货物;因为多个线程之间没有通信

4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)

201521123061 《Java程序设计》第十一周学习总结

201521123061 《Java程序设计》第十一周学习总结

201521123061 《Java程序设计》第十一周学习总结

5.查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)

在多线程的情况下的执行结果与每次单线程运行的结果一致,也就是多线程的运行结果与自己预期的结果相一致。线程安全意味着在多线程的环境下要进行同步控制的操作

3. 码云上代码提交记录

201521123061 《Java程序设计》第十一周学习总结

201521123061 《Java程序设计》第十一周学习总结的更多相关文章

  1. 201521123061 《Java程序设计》第九周学习总结

    201521123061 <Java程序设计>第九周学习总结 1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1 ...

  2. &OpenCurlyDoubleQuote;2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排

    “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排1.“提出表扬的同学:姜依萍,王雪玲,徐楠,相文君,赵晓未提交作业的同学:任红强,王瑞强,宗鹏新,扎西才让,布旦刀杰,范 ...

  3. 201871010106-丁宣元 《面向对象程序设计(java&rpar;》第十一周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  4. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  5. 20175204 张湲祯 2018-2019-2《Java程序设计》第九周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第九周学习总结 教材学习内容总结 -第十一章JDBC和MySQL数据库要点: 1.下载MySQL和客户端管理工具navi ...

  6. 20175313 张黎仙《Java程序设计》第九周学习总结

    目录 学号 20175313 <Java程序设计>第九周学习总结 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码托管 四.心得体会 五.学习进度条 六.参考资料 学号 20 ...

  7. 20175317 《Java程序设计》第九周学习总结

    20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...

  8. 20175202 《Java程序设计》第九周学习总结

    20175202 2018-2019-2 <Java程序设计>第九周学习总结 教材知识点总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称 ...

  9. 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...

  10. 20175126《Java程序设计》第九周学习总结

    # 20175126 2016-2017-2 <Java程序设计>第九周学习总结 ## 教材学习内容总结 - 本周学习方式主要为手动敲代码并理解内容学习. - 学习内容为教材第十一章,本章 ...

随机推荐

  1. SQL执行效率和性能测试方法总结

    对于做管理系统和分析系统的程序员,复杂SQL语句是不可避免的,面对海量数据,有时候经过优化的某一条语句,可以提高执行效率和整体运行性能.如何选择SQL语句,本文提供了两种方法,分别对多条SQL进行量化 ...

  2. DPC和ISR的理解

    首先来说中断 计算机的中断分为软中断和硬中断,即IRQL和DIRQL,共32个级别,从0~31级别依次提升,0~2属于软中断 一般线程运行于PASSIVE_LEVEL级别,如果不想在运行时切换到其他线 ...

  3. ural 2067&period; Friends and Berries

    2067. Friends and Berries Time limit: 2.0 secondMemory limit: 64 MB There is a group of n children. ...

  4. Javascript 中的 &amp&semi;&amp&semi; 和 &vert;&vert; 使用小结

    准备两个对象用于下面的讨论. var alice = { name: "alice", toString: function () { return this.name; } }; ...

  5. COM编程之IUnknown接口

    COM组件其实是一种特殊的类,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个类的函数和方法,也就可以做到组件通用. com就是统一的标准--通过接口来调用com组件.接口是你的com组件能 ...

  6. ECSHOP分类页面筛选功能(按分类下子分类和品牌筛选)

    其实分类页面里面本来就有相关的品牌.属性.分类的筛选功能在category.php和模板加上相应的功能即可 1.读出当前分类的所有下级分类 $chlidren_category = $GLOBALS[ ...

  7. HT for Web嵌入QtWebKit的client解决方式

    HTML5已经足够强大,但非常多应用还是须要独立桌面client的解决方式,毕竟能操作本地文件等功能还是非常多工具类软件短期内无法全然採用云方案替代. 近期Adobe公布的http://bracket ...

  8. FASM学习中的一些表格

    Size operator Registers Data directives Conditions(jmp助记符)

  9. 【壹拾壹周】final分数分配

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:12.3 git地址:https://git.coding.net/Boxer_/ho ...

  10. SRM 449 DIV 1 总结&lpar;550p标记下,下次做&rpar;

    今天的250p搞得有点久了,500p是个类似铺瓷砖的dp题,这样先占个坑,给个poj的这类题列表,下次刷完了回来做! POJ 相关DP列表 http://blog.csdn.net/jayye1994 ...