201521123056 《Java程序设计》第11周学习总结
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。

2. 书面作业
本次PTA作业题集多线程
1. 互斥访问与同步访问
完成题集4-4(互斥访问)与4-5(同步访问)
1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?
1.2 同步代码块与同步方法有何区别?
1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?
1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?
1.1 答:代码如下:
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
synchronized void deposit(int money){
lock.lock();
try {
this.balance += money;
condition.signal();
} catch (IllegalMonitorStateException e) {
// TODO: handle exception
}
finally{
lock.unlock();
}
}
synchronized void withdraw(int money){
lock.lock();
try{
while (this.balance - money < 0) {
try {
condition.await();
} catch (InterruptedException e) {
System.out.println(e);
}
}
this.balance -= money;
condition.signal();
}catch (Exception e){}
finally{
lock.unlock();
}
}
1.2 答:区别:
(1)同步方法:因为java的每个对象都有一个内置锁,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
(2)同步代码块:被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
(3)相比于同步方法的话,同步代码块更加高效一些。
1.3 答:在某个时刻内只能有一个线程获得一个资源的锁,获得锁后即可访问资源,但是其他线程就得等该资源被解锁后才可获得这个锁。
如:
class Counter {
//我是201521123056
private static int id = 0;
public static void addId() {
synchronized (Counter.class) {
id++;
}
}
public static synchronized void subtractId() {
id--;
}
public static int getId() {
return id;
}
}
线程的状态变化:
(1) t1获得id的锁,然后读取id的值,此时t2等待;
(2) t1将所取的id值+1;
(3) t1将运算后的值再赋值给id,id的锁被解锁资源释放;
(4) t2获得id的锁,然后读取id的值,此时t1等待;
(5) t2将所取的id值-1;
(6) t2将运算后的值再赋值给id,id的锁被解锁资源释放;
1.4 答:(1) 可以使用wait () 和notify()/notifyAll()方法或者Condition对象来实现线程之间的通信。
(2) 同步访问放到synchronized方法或者代码块中,是为了防止多个线程访问同一资源而引起冲突。
2. 交替执行
实验总结(不管有没有做出来)
实验总结:
(1)建立了3个类:Repo、Worker1和Worker2。Worker类实现Runnable;
(2)在Repo类的构造函数中将字符串分解存储的方法有多个;较为实用的就是调用已知方法split(" ")将字符串分解存入数组;
(3)在两个Worker类中覆盖了run方法,两个run方法的循环条件是getSize()!=0。
3. 互斥访问
3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)
3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)
参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask
3.1 截图如下:

运行结果:

3.2 截图如下:

运行结果:
4. 线程间的合作:生产者消费者问题
4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?
4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)
4.3 选做:使用Lock与Condition对象解决该问题。
4.1 答:多次运行代码发现运行结果不正常。每次运行的结果都是不确定的如下图:




原因:是Producer和Consumer的速度不一致,所以可能导致仓库所剩货物不为0,或是资源浪费的情况。
4.2 截图如下(出现了一个情况:第一次运行结果正常,但是之后的运行就停在放入100个货物完毕!不能够继续下去):

5. 查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)
答:当你的代码所在的进程中有多个线程同时运行,这段代码可能被多个线程运行,线程安全通过线程同步控制来实现的。方法可以使用synchronized关键字,就可以确保一次只能有一个线程在访问共享资源,而不是多个线程同时访问共享资源,这样就可以避免多个线程共同使用共享资源。
3. 码云上代码提交记录
题目集:多线程(4-4到4-10)
3.1. 码云代码提交记录

3.2 截图多线程PTA提交列表

201521123056 《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 若下载的是 ...
随机推荐
- 在 WebSphere Application Server V7 集群环境中管理 HTTP session[阅读]
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1012_dingsj_wascluster/1012_ding ...
- 你有没有忽略TextField的leftView这个属性
你如果想实现类似有的App注册登陆界面的特殊的TextField的左边有个小图片的效果,可以试试下边的几行代码 UIImageView *imageViewUser = [[UIImageView a ...
- 利用KVC的方式更方便地获取数组中对象的属性的最值平均值等
直接上代码 输出结果也在相应的代码里标注出来了 //main.m文件 #import <Foundation/Foundation.h> #import "Student.h&q ...
- flex详解
布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 一.Flex布局是什么? Flex ...
- 在学习泛型时遇到的困惑经常与func<T,U>混淆
在学习泛型时遇到的困惑经常与func<T,U>混淆,总认为最后一个值是返回类型.现在区分一下,原来问题出在泛型委托上. C#委托的介绍(delegate.Action.Func.predi ...
- CORS跨域资源共享你该知道的事儿
"唠嗑之前,一些客套话" CORS跨域资源共享,这个话题大家一定不陌生了,吃久了大转转公众号的深度技术好文,也该吃点儿小米粥溜溜胃里的缝儿了,今天咱们就再好好屡屡CORS跨域资源共 ...
- Java获取精确到秒的时间戳(转)
1.时间戳简介: 时间戳的定义:通常是一个字符序列,唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用.是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01 ...
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [1, 0, param1, param2]
Spring+mybatis错误:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.bi ...
- Git 默认不区分大小写
背景: 通过代码规范,修改了包名为全小写(修改了文件夹目录),但发现push后,git服务器的文件夹目录还是为大写 解决方法: git默认是不区分大小写的,意思是你修改一个文件名/文件夹的时候,git ...
- c语言 进程控制---创建进程 vfork()函数
#include "stdio.h" #include "unistd.h" #include "sys/types.h" int gvar ...