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. Java编程入门(词汇表)

    抽象类(abstract class):抽象类不能创建对象,主要用来创建子类.Java中的抽象类使用 abstract 修饰符定义. 抽象数据类型(abstract data type ADT):抽象 ...

  2. vue中将汉字按照首字母排序,也适用于其他地方,但不适用多音字

    1,.定义数组,可以是从后台传回的数据,也可以是自己写的数据(要json格式) 2.定义一个计算属性,用于将汉字排序(多音字的排序不推荐用这个) 3.在页面渲染

  3. 【Ganglia】集群监控系统搭建

    参考博客 www.cnblogs.com/atomicbomb/p/6726119.html 操作系统 centos7  机器两台 一. 配置软件环境 操作步骤: 使用yum安装方式安装所需基础依赖包 ...

  4. Notification弹出实现

    Notification的几种基本使用方法,大家肯定都已经烂熟于心,我也不必多说.给一个链接:https://zhuanlan.zhihu.com/p/25841482 接下来我想说的是android ...

  5. IT类非开发面试总结--1

    面试总结.. ================================= 第一部分.. -------------2. 电脑开机时风扇转, 但是屏幕没有任何显示, 此现象可能是哪些方面所导致? ...

  6. View.post() 不靠谱的地方你知道吗?

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章. 未经允许,不得转载. 一.前言 有时候,我们会需要 ...

  7. python 打印三级菜单

    要求: 1.用户选择城市菜单编号显示对应的下级菜单 2.可以返回上级菜单,只有在用户确定正常退出时才退出 #!/usr/bin/env python3 # -*- coding: utf-8 -*- ...

  8. 4_SSRF

    SSRF SSRF(服务请求伪造)是一种由攻击者构造形成由服务器端发起请求的一个安全漏洞,它将一个可以发起网络请求的服务当作跳板来攻击其他服务器,SSRF的攻击目标一般是内网.当服务器提供了从其他服务 ...

  9. WP开发图片保存到独立存储并从独立存储中读取

    需要添加引用命名空间 using System.IO; using System.IO.IsolatedStorage; 1.将图片保存到独立存储空间 using (IsolatedStorageFi ...

  10. [WPF]如何调试Data Binding

    前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题.这篇博客将介绍WPF Data Binding相关的内容, ...