201521123082 《Java程序设计》第11周学习总结

标签(空格分隔):java


1. 本周学习总结

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

Answer:

在上周思维导图的基础上,添加了重要备注:

其他知识点记录:

1.多线程的一些重要概念:

(1)实现Runnable的类应该被看作一项任务,而不是一个线程。在Java多线程中我们一定要有一个明确的理解,任务和线程是不同的概念。可以使用线程(Thread)执行任务(比如Runnable),但任务不是线程。

(2)Java多线程中有两种不同类型的任务,Runnable类型任务(无返回值)与Callable类型任务(有返回值)。

2.线程状态转换图:

3.其他,在下面作业中有体现就不重复了。


2. 书面作业

本次PTA作业题集多线程

1.互斥访问与同步访问

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

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

Answer:

使用Lock和Condition对象;(例子来自题目4.3)

代码块:


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

Answer:

首先引用一个两者的定义:

1.同步方法:即有synchronized修饰符修饰的方法。例:public synchronized getMoney(){}

2.同步代码块:即有synchronized修饰符修饰的语句块,被该关键词修饰的语句块。例:synchronized(Object o ){}

区别:

同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁。同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差。一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好。


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

Answer:

实现互斥访问的原理:每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。

一个例子就是public static synchronized void addld(){id++;}这个方法。假如现在有多个线程访问这个方法,只能有一个对象获得对象锁,只有当这个线程执行完后这个方法后,其他线程才能继续竞争对象锁,直到所有线程执行完。


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

Answer:

1.wait()和notify()来实现线程之间的通信,进而实现线程的协同工作。

2.放到synchronized方法或者代码块中可以避免了因同步访问而造成的共享资源不完整。


2.交替执行

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

Answer:

实验结果截图:



实验的目的实现两个线程交替执行,使用了wait(),notifyAll()来实现线程间的相互协作,实验中我定义了一个布尔值的flag来协调两个任务。还有其他的方面就是细节而已。


3.互斥访问

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

Answer:

修改前:



修改后:


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

参考资料:Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

Answer:

Executor与ExecutorService的常用方法中的invokeAll方法:


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

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

Answer:

运行出错如下:





原因:生产者与消费者的存取速度不一致,导致仓库还存有货物。


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

Answer:


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

Answer:

先留下个相关网站:Lock锁和Condition条件



运用的注意点:每个lock()的调用都必须紧跟一个try-finally子句,用来保证在所有情况下都可以释放锁。


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

Answer:

如下的测试代码:开启1000个线程,每个线程对计数器进行10000次累加,最终输出结果应该是10000000。如果没有在addCount()方法中加上了synchronized同步控制,结果如下:



synchronized同步控制:



理解:这个测试代码说明线程安全必须要使用很多synchronized关键字来同步控制才能保证结果的准确性,但是在我测试的时候发现采用了线程安全明显程序运行较慢,这就关系到效率问题

例子引用来自:Java线程安全和非线程安全

一个更详细的简书文章:Java多线程理解:线程安全的集合对象


6.选做:实验总结

6.1 4-8(CountDownLatch)实验总结

Answer:

源代码及分析:

//实例化CountDownLatch对象 latch 并赋予它初值为n
CountDownLatch latch=new CountDownLatch(n);
//调用Executors的newFixedThreadPool()方法,创建一个固定线程数的线程池。
ExecutorService exec = Executors.newFixedThreadPool(poolSize);
for (int i =0; i < n; i++) {
exec.execute(new MyTask(latch));
}

参考资料:等待多线程完成的CountDownLatch

什么时候使用CountDownLatch


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

Answer:

查询JDK6.0:



因为LinkedList等都不是线程安全的,用synchronizedList来实现线程安全。


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

Answer:

学习链接:Callable和Future


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

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

Answer:


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

Answer:

ArrayBlockingQueue中有put()和take()方法。重要的是只允许一个任务插入或者移除元素, 实现同步队列的作用。使用起来比wait()和notify()简单和方便。


8.选做:编写一段代码,证明你会使用ForkJoinPool?

文章推荐:Java 并发编程笔记:如何使用 ForkJoinPool 以及原理


3. 码云上代码提交记录

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

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

Answer:


3.2 截图多线程PTA提交列表

Answer:


4.选做:课外阅读

阅读:线程池,这一篇或许就够了

Answer:

重点笔记:

1.为什么用线程池?

(1)创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。

(2)运用线程池能有效的控制线程最大并发数

(3)对线程进行一些简单的管理,例如延时执行、定时循环执行。

2.ThreadPoolExecutor(文章归纳和总结分点很好,可以直接点链接学习)

3.常见四种线程池和使用

其他文章链接:

Java线程

Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask

Java 8 Concurrency Tutorial: Threads and Executors

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

  1. 201521123045 <java程序设计>第11周学习总结

    201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...

  2. 201521123027 <java程序设计>第11周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2.书面作业 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchro ...

  3. 2018面向对象程序设计(Java)第11周学习指导及要求

    2018面向对象程序设计(Java)第11周学习指导及要求 (2018.11.8-2018.11.11)   学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: ...

  4. 面向对象程序设计(JAVA) 第11周学习指导及要求

    2019面向对象程序设计(Java)第11周学习指导及要求 (2019.11.8-2018.11.11)   学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接 ...

  5. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  6. 2018-2019 2 20175230《Java程序设计》第九周学习总结

    <Java程序设计>第九周学习总结 主要内容 MySQL数据库管理系统 1.下载 2.安装 启动MySQL数据库服务器 1.启动 2.root用户 MySQL客户端管理工具 建立连接 建立 ...

  7. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

  8. 20175208 《Java程序设计》第九周学习总结

    20175208 2018-2019-2 <Java程序设计>第九周学习总结 一.教材学习内容总结: 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系 ...

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

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

  10. 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...

随机推荐

  1. ASP.NET windows验证IIS配置

    Windows验证时,需要配置IIS,把匿名验证设为disable,windows验证设为enable,window7 默认为匿名验证为enable,windows验证为disable. 否则会sys ...

  2. vue的一些坑(第一天)

    1:刚开始在创建项目的时候一直出现vue不是内部或外部命令 关于这个的解决方案网上给出的很多的解决方案是配置环境,这个我就不在赘述了: 但是我觉得那样太麻烦,就没用,只是重新 npm i vue-cl ...

  3. Java 加载、链接、初始化

    JVM 动态地加载.连接.初始化类或接口(在本文之后的篇幅中,我将使用"类"来表示"类和接口").这里我先贴上 Java 虚拟机规范的原文: Loading i ...

  4. DoNet 高效开发必备开发工具

    工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢? 本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环 ...

  5. mysql flush操作

    FLUSH语法 FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ... 如果您想要清除MySQL使用的部分内部缓存,您 ...

  6. MAC下pyenv和pyenv-virtualenv插件初探

    为什么会使用pyenv和pyenv-virtualenv插件 一般mac自带一个python版本,称为系统版本.对于开发者而言,肯定不够用啦.所以需要在同一个mac上组建不同的开发环境并且不会冲突. ...

  7. Fedora删除旧版本内核

    由于Fedora升级非常快,因此非常有必要清除陈旧的内核,否则的话,每次登录系统会出现多个引导项,看着烦人也占用内存: 1.查看当前使用的内核 [root@w ~]# uname -r 4.9.14- ...

  8. 【可视化】Echarts3坐标系倒映

    目标: 用echarts实现在一个echarts图表中包含上下两个坐标系 横轴合并在一块.有一种上下对称水映的视觉效果 要点提示:grid 是一个数组 包含两个grid xAxis,yAxis也都是数 ...

  9. hadoop系列四:mapreduce的使用(二)

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  10. python之路第二天 随便记记 今天主要很郁闷

    为何要有操作系统 为了让程序员更轻松的完成命令电脑工作而存在的,控制硬件,服务于软件. 操作系统的位置 操作系统位于软件和硬件之间.操作系统由内核(运行于内核态,控制硬件)和系统调用(运行于用户态,为 ...