201521123061 《Java程序设计》第十一周学习总结
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源代码使其可以同步访问。(关键代码截图,需出现学号)

3.2 进一步使用执行器改进相应代码(关键代码截图,需出现学号)
参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask
由于是批量进行任务执行所以选择invokeAll与invokeAny方法:


4.线程间的合作:生产者消费者问题
4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?
多次运行后发现结果不正常,并不是每次仓库都剩零个货物;因为多个线程之间没有通信
4.2 使用synchronized, wait, notify解决该问题(关键代码截图,需出现学号)

5.查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)
在多线程的情况下的执行结果与每次单线程运行的结果一致,也就是多线程的运行结果与自己预期的结果相一致。线程安全意味着在多线程的环境下要进行同步控制的操作
3. 码云上代码提交记录

201521123061 《Java程序设计》第十一周学习总结的更多相关文章
- 201521123061 《Java程序设计》第九周学习总结
201521123061 <Java程序设计>第九周学习总结 1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1 ...
- “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排
“2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排1.“提出表扬的同学:姜依萍,王雪玲,徐楠,相文君,赵晓未提交作业的同学:任红强,王瑞强,宗鹏新,扎西才让,布旦刀杰,范 ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第十一周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第十一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...
- 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结
20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...
- 20175204 张湲祯 2018-2019-2《Java程序设计》第九周学习总结
20175204 张湲祯 2018-2019-2<Java程序设计>第九周学习总结 教材学习内容总结 -第十一章JDBC和MySQL数据库要点: 1.下载MySQL和客户端管理工具navi ...
- 20175313 张黎仙《Java程序设计》第九周学习总结
目录 学号 20175313 <Java程序设计>第九周学习总结 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码托管 四.心得体会 五.学习进度条 六.参考资料 学号 20 ...
- 20175317 《Java程序设计》第九周学习总结
20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...
- 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 若下载的是 ...
- 20175126《Java程序设计》第九周学习总结
# 20175126 2016-2017-2 <Java程序设计>第九周学习总结 ## 教材学习内容总结 - 本周学习方式主要为手动敲代码并理解内容学习. - 学习内容为教材第十一章,本章 ...
随机推荐
- mybatis 详解(九)------ 一级缓存、二级缓存
上一章节,我们讲解了通过mybatis的懒加载来提高查询效率,那么除了懒加载,还有什么方法能提高查询效率呢?这就是我们本章讲的缓存. mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解 ...
- Jmeter关联,正则表达式提取器使用
一.Jmeter关联的方式: Jmeter中关联可以在需要获取数据的请求上 右键-->后置处理器 选择需要的关联方式,如下图有很多种方法可以提取动态变化数据: 二.正则表达式提取器: 1.比如 ...
- 数据结构-->栈
首先,栈是什么? 在代码当中,栈主要是一种实现特殊功能的一种数据结构,而不是像数组.集合之类的数据存储工具.它最大的特点就是后进先出. 那么后进先出是什么? 假设有一个数组,我们向里面添加一个数据,再 ...
- Linux操作系统位数查看
--Linux操作系统位数查看----------------------2014/05/11 查看linux是多少位的几位方法:查看linux机器是32位还是64位的方法: 方法一:file /sb ...
- linux下访问windows的共享
linux下,要访问windows的共享,有好几种情况,下面进行总结. 外面的文章,有点介绍需要使用samba,有点说什么都不需要,只需要mount加上参数, 功能是实现,不过原理,还是不太明白,我发 ...
- Linux删除其他程序正在使用的文件
今天在逛论坛时发现网友提的一个问题: 今天做实验发现,当前活动日志丢失后,数据库居然还可以正常写数据,还可以正常提交,如果是ORACLE,这个时候数据库已经崩溃了,很奇怪DB2这个时候把事务写到哪儿去 ...
- WAMP环境 apache 2.4.23 局域网访问
参考了很多大神的分享解答, 现在不知道是参考的哪个人的 如有抄袭 侵权请告知, 加上链接或者删除!!! 最近想按个分屏提高学习代码效率, 晚上突然想到可以用本本连接WiFI 然后通过 局域网访问PC ...
- 如何输入EOF
很多线上笔试的编程题要求能循环处理多个case,需使用while(scanf("%s",tmp)!=EOF)语句.EOF表示文件结束符,但是在本机的编译环境中,如何在控制台输入EO ...
- 【物联网云端对接-3】通过MQTT协议与微软Azure IoT Hub进行云端通信
在上一篇文章<通过MQTT协议与阿里云物联网套件进行云端通信>中,我们介绍了通过MQTT对接阿里云的物联网套件.其实同样的代码,稍加调整也可以对接到微软Azure IoT hub上,不过需 ...
- Linux学习总结(十一)—— Linux常用命令:版本信息查看(RedHat、CentOS、Debian、Ubuntu、Fedora、Oracle)
这篇文章收集了CentOS.Oracle.RedHat等系统查看发行版本.内核版本.位数的方法,欢迎补充. 系统 发行版本 -- 内核版本.位数 RedHat cat /etc/issue cat / ...


