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

2. 书面作业
1. 互斥访问与同步访问
完成题集4-4(互斥访问)与4-5(同步访问)
1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?
答:可以使用Lock对象和Condition对象实现互斥同步访问。
private Lock lock = new ReentrantLock();
public synchronized void setBalance(int balance) {
this.balance = balance;
}
public synchronized void deposit(int money){
lock.lock();
try{
setBalance(getBalance()+money);
}finally{
lock.unlock();
}
}
public synchronized void withdraw(int money){
lock.lock();
try{
while(getBalance()<=0){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
setBalance(getBalance()-money);
}finally{
lock.unlock();
}
1.2 同步代码块与同步方法有何区别?
答:1.同步方法 代码如: public synchronized void save(){}synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类;
2.同步代码块 即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如:synchronized(object){ }
同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?
答:若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。当线程执行synchronized语句块,需要提前得到锁才有资格执行,其他线程想要执行这个语句时,会因为无法取得对象锁定而进入等待锁定状态。执行synchronized范围的程序代码期间,若调用锁定对象的wait()方法,线程释放对象锁定,并进去等待集合而处于阻断状态,其他线程可以竞争对象锁定。
1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?
答:wait notify notifyAll 实现线程之间的通信。synchronized是解决多个线程同时访问一个方法互斥的情况,当需要进行交替或者出现其他条件,解除锁定,通知其他线程,才能是程序有顺序的进行。
2. 交替执行
实验总结(不管有没有做出来)
答:先建立一个Rope类,在类中通过 split(" "),建立任务数组;建立Worker1 和 Worker2 类,并且实现Runnable接口,通过wait() notify()方法进行交替执行,在run中用while循环,循环条件是 this.repo.getSize()!=0 ,通过奇数偶数选择Worker 线程,输出并删除任务。
3. 互斥访问
3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)

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

4. 线程间的合作:生产者消费者问题
4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?
运行的结果总是10个,结果不正常,因为规定只能存放十个,线程之间没有合作,导致无论货满,货无对两个线程都没有影响,应该加上wait 和 notify 进行判断存货情况。
4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)
public synchronized void add(String t) {
if (repo.size() >= capacity) {
System.out.println("仓库已满!无法添加货物。");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
repo.add(t);
}
notify();
}
public synchronized void remove() {
if (repo.size() <= 0) {
System.out.println("仓库无货!无法从仓库取货");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
repo.remove(0);
}
notify();
}

4.3 选做:使用Lock与Condition对象解决该问题。
5. 查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)
答:线程安全就是说多线程访问同一代码,不会产生不确定的结果。线程安全一般都涉及到synchronized 就是一段代码同时只能有一个线程来操作,不然中间过程可能会产生不可预制的结果
3. 码云上代码提交记录
3.1. 码云代码提交记录

3.2 截图多线程PTA提交列表

201521123118《java程序与设计》第11周学习总结的更多相关文章
- 20145223《Java程序程序设计》第9周学习总结
20145223<Java程序设计>第9周学习总结 教材学习内容总结 第十六章:整合数据库 JDBC入门 1.JDBC简介: 2.JDBC主要分成两个部分,JDBC应用程序开发者接口和JD ...
- 20145223《Java程序程序设计》第8周学习总结
20145223 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 ·NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区 ...
- 20145223《Java程序程序设计》第4周学习总结
20145223 <Java程序设计>第4周学习总结 教材学习内容总结 面向对象中,子类继承父类避免重复的行为定义,不过并不是为了避免重复定义行为就使用继承.程序代码重复在以后修改代码的时 ...
- 20145223《Java程序程序设计》第3周学习总结
20145223 <Java程序设计>第3周学习总结 教材学习内容总结 第四章内容 1.类与对象 如何定义一个包含有几个值域(Field成员)就是需要我们定义一个类(Class),书上给的 ...
- 20145223《Java程序程序设计》第2周学习总结
20145223 <Java程序设计>第2周学习总结 教材学习内容总结 一: 1.基本的类型: (1)整数:short(2字节).int(4字节).long(8字节) (2)字节 byte ...
- 20145223《Java程序程序设计》第1周学习总结
20145223 <Java程序设计>第1周学习总结 教材学习内容总结 1.JDK.JRE以及JVM的区别 JDK:撰写java程序语言的时候需要用到的编译工具 JRE:java执行环境 ...
- 20145223《Java程序程序设计》第7周学习总结
20145223 <Java程序设计>第7周学习总结 教材学习内容总结 ·时间的度量: (1)格林威治标准时间 (2)世界时 (3)国际原子时 (4)世界协调时间 (5)Unix时间 (6 ...
- 20145223《Java程序程序设计》第10周学习总结
20145223<Java网络编程> 一.Java的网络编程 ·网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. ·java.net包中J2SE的API包含有类 ...
- 201521123026《Java程序设》 第10周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 1.守护线程:setDaemon(true or false),如果所有前台线程死亡,守护线程自动结束,一般 ...
- 201521123118《java程序与设计》第4周作业总结
1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点 1.2 使用常规方法总结其他上课内容. 为了不必要写重复的代码,可以运用继承,用关键字extends来定义一个类,被继承的类叫做父类,继 ...
随机推荐
- butterknife的8.5.1版本问题
使用7.0.1版本没有问题compile 'com.jakewharton:butterknife:7.0.1'使用8.5.0版本时候,必须配合下面的compiler插件一起使用,否则会出现点击事件不 ...
- 前端布局之Flex语法
前端布局一直是CSS的一个重点应用,然而基于盒子模型的传统布局方案,依赖display + position + float 属性,对于某些特殊的布局非常不方便,比如:垂直居中就不容易实现.针对这一情 ...
- js 本月,下一月,上一月
<script type="text/javascript"> var curMonth = new Date(); function initDate() { ) + ...
- Django配置mysql
我的环境为windows10+pyhton3.6+Django1.11.4 由于mysqldb不支持python3,所以django连接MySQL就不能再使用mysqldb了.故而选择了mysqlcl ...
- virtualbox下正确虚拟机修改设备名称
在学习大数据管理过程中,想要修改虚拟机的设备名称(因为名称太长),所以就直接在右上角的设置中找到详细设置,直接修改设备名称,结果启动Hadoop失败!!!! 后来参考网上问题解决弄好了,现在给出修改设 ...
- [读书笔记] 二、条件注解@Conditional,组合注解,元注解
一.条件注解@Conditional,组合注解,元注解 1. @Conditional:满足特定条件创建一个Bean,SpringBoot就是利用这个特性进行自动配置的. 例子: 首先,两个Condi ...
- Python常用库大全
环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...
- .net分布式压力测试工具(Beetle.DT)
肯定有人会问为什么会写这样一个开源工具?和现有的有什么差别?不过对于一个程序员来说写东西还真不需要理由的:),主要原因是工作有点闲(开玩笑),不过说实话一个程员怎可能会停止写代码呢(作为一个奔4的程序 ...
- postman 第6节录制case
我们先安装Postman Interceptor 记得一定要安装Postman Interceptor插件,这样在谷歌浏览器上访问的信息都会在postman的app端同步显示.安装好后Postman ...
- 安装mariadb二进制程序
author:JevonWei 版权声明:原创作品 下载mariadb软件包 https://downloads.mariadb.org/mariadb/5.5.57/ 一.创建用户和准备数据目录 1 ...