学习《Java并发编程》笔记

第一章、并发设计原理

1.一些基本概念

1)并发:在单个处理器上采用单核执行多个任务即为并发。

2)同步:在并发中可以将同步定义为协调两个或多个任务以获得预期结果的机制。同步方式有两种(控制同步(当一个任务开始依赖另一个任务结束,即第二个任务不能在第一个任务完成之前开始)、数据访问同步(当两个或更多任务访问共享变量的时候,在任意时间内,只有一个任务可以访问该变量))

并发系统中的两种同步机制(信号量(一种用于控制对一个或多个单位资源进行访问的机制)、监视器(一种在共享资源之上实现的互斥机制))

2.并发应用程序中可能出现的问题

1)数据竞争:如果两个或者多个任务在临界段(临界段是一段代码,可以访问共享资源,在任何给定时间,只能被一个任务执行)之外对一个共享变量写入操作,也就是没有任何的同步机制,那么应用程序就存在数据竞争(也叫做竞态条件)。

2)死锁:两个或多个任务正在等待另一线程释放某个共享资源,而该线程又再等待前述任务之一释放正在共享的资源,并发程序就出现了死锁。产生死锁的条件(又称为Coffman条件)(互斥(死锁中占有的资源必须是不可共享的)、占有并等待条件(一个任务占有某一互斥的资源又请求另一互斥的资源)、不可剥夺(资源只能被持有它的任务释放)、循环等待(任务A等任务B,任务B等任务C,任务C等任务A))。避免死锁的机制(忽略它们、检测、预防(防止以上的Coffman条件)、规避(在任务执行之前得到该任务所使用的资源相关信息))

3)活锁:系统中两个任务,总是因对方的行为而改变自己的状态。

4)资源不足:某个任务在系统中无法维持其继续执行所需的资源。解决这个问题需要公平原则。等待某一资源的任务必须在某一给定时间之内占有该资源。实现一个算法,在选择下一个占有这个资源的任务的时候将任务等待资源的时间因素考虑进去。

5)优先权反转:低优先权的任务得到了高优先权任务所需的资源。

4.Java并发API

1)Java并发API包括多种同步机制(synchronized关键字(使用这个关键字定义一个临界段)、Lock接口、Semaphore类、CountDownLatch类、CyclicBarrier类、Phaser类)

 

第二章:使用基本元素:Thread抽象类和Runnable接口

1.得到线程对象的方法(继承Thread方法并重载run()、实现Runnable接口,并将该类的对象传递给Thread对象的构造函数)。第二种方法更好,因为(类实现了Runnable接口后可以继承其他类或实现其他接口,继承了thread类就不能继承其他类;可以通过不同线程来使用同一Runnable对象;可以通过线程来执行Runnable对象,也可以通过其他类似执行器的Java并发对象来执行。)

2.Java中的线程:特征与状态

1)所有Java程序都有一个名为主线程的Thread对象,这是非并发应用程序的唯一线程,也是并发程序中的第一个线程。

2)Java中的所有线程都有一个优先级。

3)Java中可创建两种线程(守护线程、非守护线程),二者区别在于如何影响程序的结束。所有非守护线程均已结束执行,无论是否有正在运行的守护线程,Java程序都将结束执行。isDaemon()检查是否是守护线程,setDaemon()将某个线程设为守护线程,但必须在start()方法之前调用该方法。

4)线程状态不同,getState()可查看线程状态。

3.Thread类中的一些方法

interrupt()、interrupted()、isInterrupted():第一种请求结束某一个Thread对象,第二和三用于检查中断状态。区别在于调用interrupted()将清除中断标志的值,而isInterrupted()不会。

sleep():将线程的执行暂停一段时间,接收long型的参数,希望停多少毫秒。

join():这个方法将暂停调用线程的执行,直到调用该方法的线程执行结束为止,在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。

第三章:管理大量线程:执行器

1.执行器基本特征:

1)不需要创建任何Thread对象。如果执行一个并发任务,只需要创建一个执行该任务(例如一个实现了Runnable接口的类)的实例并且将其发送给执行器。执行器会管理执行该任务的线程。

2)执行器通过重新使用线程来缩减线程创建带来的开销。

3)使用执行器控制资源很容易

4)必须以显示方式结束执行器的执行,必须告诉执行器完成执行之后终止所创建的线程。

2.执行器框架的基本组件

1)Executor接口:仅定义了一个方法,即允许编程人员像执行器发送一个Runnable对象。

2)ExecutorService接口:扩展了Executor接口,增加了更多功能:

a.执行可返回结果的任务(Runnable接口提供的run()方法并不会返回结果,但是借用执行器能返回结果)

b.通过单个方法调用执行一个任务列表

c.结束执行器的执行并且等待其终止

3)ThreadPoolExecutor类:实现了以上两接口,

4)Executors类:该类为创建Executor对象和其他相关类提供了实用方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值