201521123036 《Java程序设计》第11周学习总结
本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。
书面作业
本次PTA作业题集多线程
互斥访问与同步访问
1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?
也可以使用synchronized代码块,将属性balance上锁,生成对象锁,实现互斥同步访问。

1.2 同步代码块与同步方法有何区别?
answer:同步代码块只是对某些对象上锁,未获得对象锁就无法访问。而同步方法是对某个方法上锁,需要等待同步方法执行完毕返回结果。
1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?
answer:对同一资源进行存取时会出现互斥的现象。所以要对线程进行调度,对方法或对象上锁,调用时需要获得对象锁,如果没有对象锁就要等待同步锁被释放才能获取对象锁。当程序执行synchronized同步代码块或者同步方法时,线程先是获取CPU处于Running状态,获取对象的同步锁时,若该同步锁被别的线程占用就会进入Lock Pool中等同步锁释放再次进入Runnable。如果在进入块中执行了wait(),就会进入Wait Pool等待被notify/notifyAll唤醒,进入Lock Pool中。
1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?
answer:Java多线程中使用了wait () 和notify()/notifyAll()等关键字实现线程之间的通信。wait()可以使线程进入等待状态,再被其他线程notify()/notifyAll()唤醒,进而实现线程的协同工作。有了synchronized上锁后,其他线程才会等待同步锁释放并竞争获取锁,执行wait()会使线程放弃对象锁并堵塞,等到其他线程notify()唤醒时再重新进入等待同步锁释放并竞争同步锁的状态。
交替执行
4-6 实验总结(不管有没有做出来)
answer:Repo中存储不同的任务使用的是ArrayList,任务执行完直接用list.remove(0)移除此任务。两个线程交替执行时是对Worker1上锁,然后用wait()与notify中对线程进行调度。最开始是使用Synchronized对两个run方法上同步锁,再进行调度,出现了线程比较混乱的状况,每次的执行结果都不同。最后当list为空的时候,要终止线程。
互斥访问
3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)
3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)

运行结果:
参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask
线程间的合作:生产者消费者问题
4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?
answer:结果不正常。会出现“仓库已满!无法添加货物。”,“仓库无货!无法从仓库取货”的错误提示。因为出项了互斥访问,无法同步对同一数据进行存取,线程混乱,结果就出现了这些问题。
4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)
4.3 选做:使用Lock与Condition对象解决该问题。
查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)
answer:在多线程的情况下,可能会发生互斥,无法同步的问题。此时线程就会出现异常,或执行顺序混乱。比如消费者与生产者同时存取同一数据时就会产生互斥访问。线程安全是采用锁的形式对线程的执行顺序进行调度。可以使用synchronized, wait, notify或Lock或线程池来有序执行线程。比如可以在消费者与生产者互斥时,对add和remove方法上锁,使用wait, notify来调整获得对象锁的线程。
选做:实验总结
6.1 4-8(CountDownLatch)实验总结
answer:此题需要使用的是执行器中的固定线程数线程池,即Executors.newFixedThreadPool(poolSize);poolSize为固定的线程数。CountDownLatch允许线程一直等待,直到其他线程的操作执行完后再执行。任务类要实现Runnable接口。
6.2 4-9(集合同步问题)实验总结
answer:使用Collections.synchronizedList解决集合的同步问题,确保线程安全
6.3 较难:4-10(Callable),并回答为什么有Runnable了还需要Callable?实验总结。
answer:4-10主要根据题目要求写,实现Callable接口的类里面要有call()方法,任务执行时会调用call()方法,并可将返回值提交到Future型的列表中,之后再依次读取。使用Callable可以得到返回值,便对计算结果进行验证。
###7.1 使用`BlockingQueu`e解决生产者消费者问题关键代码截图
###7.2 说明为什么不需要显示的使用wait、notify就可以解决同步问题。这样解决相比较wait、notify有什么优点吗?
##选做:使用其他方法解决题目4的生产者消费者问题。
###7.3 使用`Condition`解决生产者、消费者问题。
选做:编写一段代码,证明你会使用ForkJoinPool?
码云上代码提交记录
题目集:多线程(4-4到4-10)
3.1 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图多线程PTA提交列表

选做:课外阅读
4.1 Questions and Exercises: Concurrency,学习总结。
4.2 Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask
4.3 Java 8 Concurrency Tutorial: Threads and Executors
201521123036 《Java程序设计》第11周学习总结的更多相关文章
- 201521123045 <java程序设计>第11周学习总结
201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...
- 201521123027 <java程序设计>第11周学习总结
1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchro ...
- 2018面向对象程序设计(Java)第11周学习指导及要求
2018面向对象程序设计(Java)第11周学习指导及要求 (2018.11.8-2018.11.11) 学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: ...
- 面向对象程序设计(JAVA) 第11周学习指导及要求
2019面向对象程序设计(Java)第11周学习指导及要求 (2019.11.8-2018.11.11) 学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 2018-2019 2 20175230《Java程序设计》第九周学习总结
<Java程序设计>第九周学习总结 主要内容 MySQL数据库管理系统 1.下载 2.安装 启动MySQL数据库服务器 1.启动 2.root用户 MySQL客户端管理工具 建立连接 建立 ...
- 20175209 《Java程序设计》第九周学习总结
20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...
- 20175208 《Java程序设计》第九周学习总结
20175208 2018-2019-2 <Java程序设计>第九周学习总结 一.教材学习内容总结: 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系 ...
- 20175202 《Java程序设计》第九周学习总结
20175202 2018-2019-2 <Java程序设计>第九周学习总结 教材知识点总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称 ...
- 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结
20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...
随机推荐
- Connect By、Level、Start With的使用
--Connect By.Level.Start With的使用 --------------------------------------2013/11/20 Syntax 1 CONNECT B ...
- SGI STL 内存分配方式及malloc底层实现分析
在STL中考虑到小型区块所可能造成的内存碎片问题,SGI STL设计了双层级配置器,第一级配置器直接使用malloc()和free();第二级配置器则视情况采用不同的策略:当配置区块超过128byte ...
- python 第六天
模块 包 我们可以同过包来避免与其它模块的命名冲突,例如,调用在外层 demo.py 调用 demoFile 文件夹中的demo.py 就可以通过 demo.demo 来调用 请注意,每一个包目录下面 ...
- node.js版本管理for window ---- nvmw
1.下载nvmw https://github.com/amiezhang/nvmw ,解压后放在某盘中 如D:\nvmw 也可以直接放在node.js的node_modules里面(这样操作就可以 ...
- node.js之setTimeout()、clearTimeout()与 setInterval()与clearInterval()
1.setTimeout函数与clearTimeout函数 setTimeout(cb,ms,[arg],[...])延时一定时间执行回调函数该函数中cb参数为必填函数,为需要执行的回调函数ms为经过 ...
- apache-DOS
对DSO的理解还不是特别深刻,所以把自己查来的资料整理一下并想就此作一个总结.暂时先把资料堆到blog里面了,有时间再整理总结. 一.以下源于<Apache HTTP Server Vers ...
- tomcat替换.class文件并没有生效的原因(失效原因)(转)
紧急关头难免会替换class文件,但一定要注意一下几点. 1.小心class内中的project 的类的后,替换文件需要加上 $classMapper这个类, 编译成class的时候,会把public ...
- java 数组去重总结
如果一个数组中有重复元素,用什么方法可以去重?有其他方法继续更新 一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> ...
- python 学习网站
python 文档库 docs.python.org/2/library/index.html python 第三方模块查找 pypi.python.org
- C / C++ 运行环境搭建教程
C / C++ 运行环境搭建教程 一.实验环境 本机操作系统:Windows 7 64位 虚拟机:VMware Workstation 12 pro 虚拟机操作系统:Linux CentOS 7 二. ...


