201521123103 《Java学习笔记》 第十一周学习总结
一、本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。

二、书面作业
本次PTA作业题集多线程
1、互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问)
1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?
答:使用Lock方法和Condition对象
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Account {
private int balance;
private Lock lock = new ReentrantLock();
private Condition plus = lock.newCondition();
public Account(int balance) {
super();
this.balance = balance;
}
public int getBalance() {// synchronized
return balance;
}
public void deposit(int money) {// synchronized
lock.lock();
try {
this.balance=getBalance()+money;
plus.signalAll();
} finally {
lock.unlock();
}
}
public void withdraw(int money) {// synchronized
lock.lock();
try {
while (getBalance() <= 0) {
try{
plus.await();
}catch(InterruptedException e){
e.printStackTrace();
}
}
this.balance=getBalance() - money;
plus.signalAll();
} finally {
lock.unlock();
}
}
}
1.2 同步代码块与同步方法有何区别?
答:同步方法直接在方法前加synchronized关键字,同步代码块则在方法内部添加锁,同步块需要注明锁定对象,而同步方法默认锁定this,同步的方法一次只能有一个线程进入,其他线程等待。在考虑性能方面,最好使用同步块来减少锁定范围提高并发效率。
1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?
答:当资源被访问,上锁,但在同一时刻,只能有一个线程获得某个资源的锁,访问该资源,其他线程无法访问。当停止访问时,解锁,让其他线程访问。
class Counter {
private static int id = 0;
public synchronized static void addId() {
id++;
}
public static int getId() {
return id;
}
假设现在有两个线程t1,t2,同时执行该方法,当程序执行synchronized标记的同步方法时,操作步骤如下:
1.线程t1获得id的锁,读取id的值,为0;(线程t2等待)
2.线程t1在取到的值上加1,结果为1;
3.线程t1将结果id=1存回id,id的锁被解锁资源释放;
4.线程t2获得id上的锁,读取id的值,为1;
5.线程t2在取到的值上加1,结果为2;
6.线程t1将结果id=2存回id,id的锁被解锁资源释放;id结果为2。
1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?
答:Java多线程中用wait()和notify()/notifyAll()方法来实现线程之间的通信,或者使用Condition对象。同步访问放到synchronized方法或者代码块中是为了防止出现多个线程访问同一资源所引起的冲突。
2、交替执行
实验总结(不管有没有做出来)
答:Repo类中有两个run()方法且run1()和run2()方法都用synchronized关键字修饰。要做到交替执行,需要中间桥梁来确认是否执行该任务,这个桥梁就是flag。定义private boolean flag = true;所以run1()循环条件是while(!flag),当if(getSize()>0)时,输出并使flag的值为false。当flag为false时,work1线程等待work2执行。run2()循环条件是while(flag),当if(getSize()>0)时,输出并使flag的值为ture。当flag为true时,work2线程等待work1执行。
3、互斥访问
3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)

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

参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask
4、线程间的合作:生产者消费者问题
4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?
答:结果不正常,剩余个数从0到10皆有,因为生产者与消费者的存取速度不一致,所以会导致生产和消费不一致。也就是说没有实现线程之间通信的关键字,故线程之间没有合作,就会产生错乱。



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


4.3 选做:使用Lock与Condition对象解决该问题。

5、查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)
答:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
三、码云上代码提交记录
题目集:多线程(4-4到4-10)
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图多线程PTA提交列表

201521123103 《Java学习笔记》 第十一周学习总结的更多相关文章
- 20172325 2017-2018-2 《Java程序设计》第十一周学习总结
20172325 2017-2018-2 <Java程序设计>第十一周学习总结 教材学习内容总结 Android简介 Android操作系统是一种多用户的Linux系统,每个应用程序作为单 ...
- 201521123061 《Java程序设计》第十一周学习总结
201521123061 <Java程序设计>第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 本周学习的是如何解决多线程访问中的互斥 ...
- 201521123072《java程序设计》第十一周学习总结
201521123072<java程序设计>第十一周学习总结 1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问 ...
- 201521123038 《Java程序设计》 第十一周学习总结
201521123038 <Java程序设计> 第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多 ...
- 201621123080《Java程序设计》第十一周学习总结
201621123080<Java程序设计>第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十一周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十一周学习总结 实验九 泛型程序设计技术 实验时间 2019-11-8 1.实验目的与要求 (1) 理解泛型概念: (2 ...
- 201871010123-吴丽丽《面向对象程序设计(Java)》第十一周学习总结
201871010123-吴丽丽<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010101-陈来弟《面向对象程序设计(Java)》第十一周学习总结
201871010101-陈来弟<面向对象程序设计(Java)>第十一周学习总结 实验九 泛型程序设计技术 实验时间 2019-11-8 第一部分:理论基础知识 1.什么是泛型类 泛型是 ...
- 201871010104-陈园园 《面向对象程序设计(java)》第十一周学习总结
201871010104-陈园园 <面向对象程序设计(java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010105-曹玉中《面向对象程序设计(java)》第十一周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第十一周学习总结 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/ ...
随机推荐
- 关于mysql中的数据查询—嵌套查询
嵌套查询 一个SELECT FROM WHERE语句称为一个查询块. 嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询. 注:子查询的SELECT语句中不 ...
- Maven详解(二)------ Maven的安装配置
1.下载 Maven ①.官网下载地址:http://maven.apache.org/download.cgi ②.百度云盘:http://pan.baidu.com/s/1eS1NVYa 密码:9 ...
- Fedora25和win10双系统安装及使问题汇总
安装问题汇总 1.U盘引导制作后,开机出现":Assuming driver cache: write through" 解决方案:经过排查后,怀疑是U盘启动制作出了问题,后来查阅 ...
- 【Ubuntu 16】安装eclipse
1.将eclipse.tar.gz传送到/home/xxx/下,解压缩,这里我已经配置好了JDK1.7,所以eclipse配置了就可以使用 2.创建快捷方式 dream361@master:~$ to ...
- 用IO流中的File类来创建文件及目录
题目如下: 设计一个命令窗口程序,要求按照如下的格式显示 例如:===利用命令窗口完成文件的操作===(1)创建目录 (2)创建文件 (3)删除目录 (4)删除文件 ===现在正在做创建目录的操作== ...
- 使用angular的HttpClient搭配rxjs
一.原Http使用总结 使用方法 在根模块或核心模块引入HttpModule 即在AppModule或CoreModule中引入HttpModule: import { HttpModule } fr ...
- Google研究人员宣布完成全球首例SHA-1哈希碰撞!
2004年的国际密码讨论年会(CRYPTO)尾声,我国密码学家王小云及其研究同事展示了MD5.SHA-0及其他相关杂凑函数的杂凑碰撞并给出了实例.时隔13年之后,来自Google的研究人员宣布完成第一 ...
- SSH:dataSource配置问题
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- LNMP1.4 PHP升级脚本
升级PHP前,请确认你的网站程序是否支持升级到的PHP版本,防止升级到网站程序不兼容的PHP版本,具体可以去你使用的PHP程序的官网查询相关版本支持信息.v1.3及以后版本大部分情况下也可以进行降级操 ...
- httpclient 学习
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基 ...