第13章:并发

对象技术提供了一种把程序划分为若干独立部分的方式。通常,还需要把程序转换为彼此分离的,
能独立允许的子任务。
1。写一个线程最简单的做法是从java.lang.Thread继承,这个类已经具有创建和运行线程
    所必要的构架。Thread最重要的方法是run(),覆盖这个方法实现所要的功能。
    start方法用来为线程执行特殊的初始化。

2。yield()让步方法,给线程调度机制一个暗示:你的工作已经做的差不多了,可以让别的
     线程使用CPU了。不过这只是一个暗示,没有任何机制保证会被采纳。所以不要依赖它。

3。sleep方法,使线程停止执行一段时间(毫秒)。sleep必须放在try块中,因为sleep方法
      在休眠到期之前可能被中断。如果某人持有对线程的引用,并在线程上调用了interrupt方法
     就会发生这种情况。线程的wait , join 方法也必须放在try块中。

4。用setPriority设置优先级,getPriority获得优先级。各个系统的优先级数目使不同的,
       唯一可移植的方法是当调整优先级只使用,MAX_PRIORITY,NOMAL_PRIORITY
       MIN_PRIORITY.

5。volatile 关键字指示字段可由操作系统、硬件或并发执行的线程在程序中进行修改。
     要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,
     即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
     声明为volatile修饰,保证编译器不进行优化。
     一般说来,volatile用在如下的几个地方:
        1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
        2、多任务环境下各任务间共享的标志应该加volatile;
        3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义; 

6。setDaemon(true)使线程为后台线程,后台进程是指:在程序允许的时候后台提供一种通用的
        服务线程,并且这种线程不属于程序不可或缺的部分。但所有非后台进程结束是,程序也就终止了。
       一个后台线程,那么它创建的任何线程将被自动设置成后台线程。

7。线程A可以在线程B上调用B.join方法,其效果是等待一段时间知道B结束才继续执行,A将被挂起,知道
     B结束才恢复(即:B.isAlive()返回假)。

8。多线程的另一个方法是:实现Runnable接口,实现run方法。
     但是Runnable并不表示它是一个线程对象,要想创建线程需要调用建立Thread(Runnable)。
     通常使用内部类把线程有关的代码隐藏在类的内部。

9。java提供synchronized关键字,为防止资源冲突提供内置支持。当线程要执行被synchronized关键字
     保护的代码片断时,它将检查信号量是否存在,然后获锁,执行代码,释放锁。

10。 对象形式的资源,一般把所有要访问这个资源的方法标记为synchronized,包括static方法。如:
     synchronized void f(){/* */};
     当对象上调用任意synchronized方法时,对象被加锁,对象上的其他synchronized方法要等到前一个
     方法释放锁才能被调用。

11。原子操作不能被线程调度机制中断,一旦操作开始,那么它一定在可能发生的"上下文切换"之前执行完毕。
        如果问题中的变量类型时除了long或者double以外的基本类型,对于变量进行的简单赋值或者返回
       值操作时原子操作。(因为long/double比其他基本类型要大)然而,只有给long/double加上volatile
        操作就是原子的了。++在java里不是原子的。

12。synchronize(synObject){
          //this code can be accessed by only one thread at a time
          }
         定义了临界区。通常用synchronized(this)

13。线程之间的协作关键使通过线程之间的"握手机制"来进行,这种握手通过Object的wait()和notify(),
        notifyAll()完成。调用这些方法前必须获得对象的锁。
        synchronized(x){
          x.notify();
        }

14。线程间使用管道进行输入输出。I/O库的对应类是:PipedWriter,PipedReader.它们通过构造器相关。

15。多线程会发生死锁,java对死锁没有语言层面上的支持。

16。为了减小死锁可能,java 2废弃了Thread类的stop(),suspend(),resume()方法。
        可以设置轮询标志的方法解决进程的stop,用Thread.interrupt()跳出阻塞代码 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值