201521123038 《Java程序设计》 第十一周学习总结


1. 本周学习总结

1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容。


2. 书面作业

本次PTA作业题集多线程

1.互斥访问与同步访问

完成题集4-4(互斥访问)与4-5(同步访问)

1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥同步访问(请出现相关代码)?

  • 互斥访问:Lock
  • 同步访问:Condition,需要搭配Lock

用PTA上的题目进行修改:

class Account
{
private int balance; private Lock lock=new ReentrantLock();
private Condition condition=lock.newCondition(); public int getBalance() {
return balance;
} public void setBalance(int balance) {
this.balance = balance;
}
public Account(int balance)
{
setBalance(balance);
}
public void deposit(int money)
{
lock.lock();
try
{
this.balance=balance+money;
condition.signalAll();
}finally{
lock.unlock();
} }
public void withdraw(int money)
{
lock.lock();
try
{
if(balance<money){
try
{
condition.await();
}catch(Exception e)
{ }
}
}finally{
lock.unlock();
}
}
}

1.2 同步代码块与同步方法有何区别?

  • 同步方法是对某个方法加锁,同步代码块是对某个方法内部的某段代码加锁,同步代码块可以比同步方法控制范围更具体
  • 同步方法
	synchronized void fun(){}

或:

	void fun(){
synchronized(this){}
}
  • 同步代码块
	void fun(){
synchronized(某个对象){}
}

1.3 实现互斥访问的原理是什么?请使用对象锁概念并结合相应的代码块进行说明。当程序执行synchronized同步代码块或者同步方法时,线程的状态是怎么变化的?

  • 当一个资源可以被任意使用,那么可能会造成混乱。现在对一个资源加上锁,当这个资源被A使用的时候,资源上锁,当A使用完解锁。假设A正在使用,当B想使用这个资源,则必须要等A使用完之后,B才可以使用这个资源。
	public synchronized void withdraw(int money)
{
if(balance-money>=0)
this.balance=balance-money;
else balance=balance-money;
if(balance<0)
throw new IllegalStateException(balance+""); }

模拟银行存取钱系统,可能有多个线程通过withdraw方法同时取钱,如果不加锁会造成混乱。假设线程A正在进行取钱操作,方法withdraw上锁,B,C要进行该操作需要等待,A取钱完毕,withdraw解锁,线程B调用该方法,withdraw再次上锁...

1.4 Java多线程中使用什么关键字实现线程之间的通信,进而实现线程的协同工作?为什么同步访问一般都要放到synchronized方法或者代码块中?

  • 一般线程的wait(),notify()
  • Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll()
  • 同步访问一般都要放到synchronized方法或者代码块中是为了防止多个线程同步访问一个资源时造成冲突,例:银行取钱

2.交替执行

实验总结(不管有没有做出来)

  • 尝试1:在Worker1和Worker2中直接for(int i=0;i<repo.getSize();i+=2)进行交替操作,运行成功,PTA运行超时。
  • 尝试2:设flag,通过flag进行交替操作,只能输出两行,即第一次执行的交替操作。是因为在Worker1和Worker2中有自己的属性:private Repo repo.在构造函数中执行this.repo=repo后,这两个类中的repo属性互不相干,在写代码的时候没有考虑到这一点,执行后续操作对另一个类的后续操作不会造成影响。后来把这部分内容移到Repo类中,新建两个任务函数,可以运行成功。
  • 要注意wait()和notify()的使用位置
  • 明确知道下一个要唤醒的线程时,尽可能使用notify()而非notifyAll(),notifyAll将唤醒所有线程。

(附)Java的wait(), notify()和notifyAll()使用小结


3.互斥访问

3.1 修改TestUnSynchronizedThread.java源代码使其可以同步访问。(关键代码截图,需出现学号)

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


4.线程间的合作:生产者消费者问题

4.1 运行MyProducerConsumerTest.java。正常运行结果应该是仓库还剩0个货物。多运行几次,观察结果,并回答:结果正常吗?哪里不正常?为什么?

不正常,除了0以外还出现过剩余10个货物的情况。add和remove方法都用到了synchronized,但在处理过程中并未用到wait()和notify()进行处理。所以只能保证线程间不互斥,但这两个线程同时工作的时候不能保证运行结果。

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

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


5.查询资料回答:什么是线程安全?(用自己的话与代码总结,写自己看的懂的作业)

  • 线程安全针对的是多线程对共享资源的访问。线程安全是要防止某个方法或者代码块同时被多个线程访问。如果这个资源不加任何防范措施地被多个线程同时访问,可能会因为每个线程的运行速率导致最后的结果不同。一般要对这个资源进行互斥和同步访问操作,保证每次只能有一个线程在访问。这样用多线程处理某个问题的时候能保证最后结果的稳定性。
	public synchronized void withdraw(int money){
... ...//存款小于取款时不取钱
}

用withdraw举例,假设余额100,A,B同时取60,70。未用synchronized,余额可能是40或30,此时的结果不唯一,线程是不安全的。在用synchronized进行保护后,能保证最后的余额是A取完钱之后的余额40,能保证B不能成功取款,结果唯一,线程安全。


6.选做:实验总结

6.1 4-8(CountDownLatch)实验总结

  • CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
  • FixedThreadPool()可控制同时执行的线程数

    (附)线程池

6.2 4-9(集合同步问题)实验总结

  • Collections.synchronizedList可以处理多个线程访问一个ArrayList时,对ArrayList进行修改而需要考虑的线程安全问题。

6.3 较难:4-10(Callable),并回答为什么有Runnable了还需要Callable?实验总结。

  • Runnable接口中的public void run()方法无返回值
  • Callable接口中的call()方法有返回值

7.选做:使用其他方法解决题目4的生产者消费者问题。

7.1 使用BlockingQueue解决生产者消费者问题关键代码截图

7.2 说明为什么不需要显示的使用wait、notify就可以解决同步问题。这样解决相比较wait、notify有什么优点吗?

7.3 使用Condition解决生产者、消费者问题。


3. 码云上代码提交记录

题目集:多线程(4-4到4-10)

3.1. 码云代码提交记录

3.2 截图多线程PTA提交列表

201521123038 《Java程序设计》 第十一周学习总结的更多相关文章

  1. 201521123038 《Java程序设计》 第二周学习总结

    201521123038 <Java程序设计> 第二周学习总结 1.本章学习总结 学会在Java程序中使用函数,使程序层次更清晰 使用StringBuilder编写代码,减少内存空间的占用 ...

  2. 201521123038 《Java程序设计》 第一周学习总结

    201521123038 <Java程序设计> 第一周学习总结 1.本章学习总结 本周已掌握Java配置,初步认识Java运行软件和基本语法. Java语言语法和C语言基本类似,部分不同. ...

  3. 201521123038 《Java程序设计》 第九周学习总结

    201521123038 <Java程序设计> 第九周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 ...

  4. “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排

    “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排1.“提出表扬的同学:姜依萍,王雪玲,徐楠,相文君,赵晓未提交作业的同学:任红强,王瑞强,宗鹏新,扎西才让,布旦刀杰,范 ...

  5. 201871010106-丁宣元 《面向对象程序设计(java)》第十一周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  6. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  7. 20175204 张湲祯 2018-2019-2《Java程序设计》第九周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第九周学习总结 教材学习内容总结 -第十一章JDBC和MySQL数据库要点: 1.下载MySQL和客户端管理工具navi ...

  8. 20175313 张黎仙《Java程序设计》第九周学习总结

    目录 学号 20175313 <Java程序设计>第九周学习总结 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码托管 四.心得体会 五.学习进度条 六.参考资料 学号 20 ...

  9. 20175317 《Java程序设计》第九周学习总结

    20175317 <Java程序设计>第九周学习总结 学前准备 首先下载XAMPP,下载完成后打开: 将前两个选项打开 在IDEA中配置驱动mysql-connector-java-5.1 ...

  10. 20175202 《Java程序设计》第九周学习总结

    20175202 2018-2019-2 <Java程序设计>第九周学习总结 教材知识点总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称 ...

随机推荐

  1. 错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据

    数据库导入导出时总失败,错误信息如下: 正在验证 (错误) 消息错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据. (SQL Server 导入和导出向导) 错误 0xc ...

  2. ubuntu 创建 PyCharm 桌面快捷方式 (或者叫 启动器 )

    优麒麟新出的 17.04 新加了各种软件支持.忍不住体验一把.可是安装完 PyCharm 之后,总是无法创建桌面快捷方式(这种说法貌似是windows的,ubuntu不认,它管这种方式 叫 启动器). ...

  3. xcode调试打印QString

    xcode调试打印QString xcode内置GDB,在调试工程过程中可以通过print命令打印基本的数据类型,但像QString这样复杂类型就不行了.虽然我们可以在程序代码通过添加Qt的调试打印语 ...

  4. java微信公众平台开发

    微信公众平台的开发,总体说来也是简单的,就是先大概看下微信公众平台接口文档. 请先大概浏览一下API手册,我们会发现,推送给微信服务器的数据有两种:xml的形式,和json的形式. 那么什么时候是XM ...

  5. Eclipse安装Hibernate插件快速生成配置文件

    Eclipse安装Hibernate插件快速生成配置文件 插件链接: http://pan.baidu.com/s/1mi3KVtI 密码: kmjg 1.安装插件: 1.在eclipse顶部窗口he ...

  6. WeQuant交易策略—网格交易

    网格交易策略(Grid Trading) 策略介绍 网格策略本质上是一种低吸高抛的策略.标的物价格越低,吸纳的头寸越多:标的物价格越高,卖出的头寸越多.网格策略巧妙地借鉴了日常生活中渔翁撒网扑鱼的思路 ...

  7. BotVS趋势交易策略-MA均线

    1. 均线策略1号 思路:使用MA小时线,入市线金叉买入,出市线死叉时卖出.代码如下 import types def main(): STATE_IDLE = -1 state = STATE_ID ...

  8. (转)没有IE就没有伤害!浏览器兼容性问题解决方案汇总

    普及:浏览器的兼容性问题,往往是个别浏览器(没错,就是那个与众不同的浏览器)对于一些标准的定义不一致导致的.俗话说:没有IE就没有伤害. 贴士:内容都是自己总结的,不免会出现错误或者bug,欢迎更正和 ...

  9. Catalan Number 卡特兰数

    内容部分来自以下博客: Cyberspace_TechNode 邀月独斟 一个大叔 表示感谢! Catalan数的引入: 一个长度为2N的序列,里面有N个+1,N个-1 它的任意前缀和均非负,给定N, ...

  10. 2D 和 3D 中的 CSS 轉換 (Preliminary) CSS3中 translate3D详解

    http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/ http:/ ...