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

时间:2021-06-20 07:53:47
  • 1. 本周学习总结

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

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


  • 2. 书面作业

本次PTA作业题集多线程

①互斥访问与同步访问

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

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

A:

可以使用Lock对象和Condition对象来实现。

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

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

A:

从字面上来看,同步代码块用于整个代码块,而同步方法用于整个方法。同步代码块是有synchronized关键字修饰的语句块,被该关键字修饰的语句块会自动被加上内置锁,从而实现同步,而使用时synchronized关键字是在方法中引用。而同步方法是有synchronized关键字修饰的方法,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态,而使用时synchronized关键字是在void前定义。

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

A:

首先我们知道互斥访问的定义是当两个或两个以上的线程需要同时对统一数据存取,若线程之间不加以控制,会产生竞争,这样的情况下我们必须学会互斥存取,而互斥访问是一种手段。而其原理结合对象锁为,对象需有对象锁才能进行线程,当执行任务时给其加锁,直到解锁前其他对象无法使用,一对象进行一资源的模式。

用 synchroined关键字修饰方法举例:
public synchronized void duixianglock()
{
System.out.println("duixianglock---in");
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("duixianglock---out");
}

状态变化为:多个线程运行 ——> 一个线程得到对象锁,其余线程等待 ——> 当前线程解锁,其余线程竞争 ——> 以此类推,直到所有线程运行结束。

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

A:

一般使用wait()关键字和notify()关键字来实现。因为在多线程的情况下,同一进程的多个线程实际共享了同一片存储空间,虽然方便,但也会有访问冲突的问题。如果用synchronized关键字就可以有效避免同一个数据对象被多个线程同时访问。


②交替执行

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

A:

截图Worker1代码。实验总结:这道题主要是在Worker1和Worker2类的编写,要使其继承Runnable接口。若是两个线程交替运行,需要使用wait()和notify()函数,还要在方法或代码块中加入synchronized关键字。过程中碰到的问题是不熟悉wait()和notify()函数,所以以另种方法来写。

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


③互斥访问

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

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

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

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

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


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

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

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

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

A:

多运行几次后可得到出现以上两种结果。不正常,因为代码中没有实现线程之间通信的关键字,故线程之间没有合作,就会产生错乱。

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

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


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

A:

线程安全:就是若你的代码有多个线程在同时运行,而这些线程也可能会同时运行这段代码。那么,假如多个线程每次运行得结果和单线程运行的结果相同,并且其他的变量的值也和预期的得相同的话,那此时就为线程安全。


  • 3. 码云上代码提交记录

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

  • 3.1. 码云代码提交记录

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

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


  • 3.2 截图多线程PTA提交列表

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