-
扩展Java并发知识,参考书查看全部
-
wait set -- 线程的休息室 Critical Section 共享资源/共享数据 --- 临界区 当现在有一个线程需要访问共享资源的时候 首先,需要获得锁,当它获得了锁之后将进入临界区进行操作 操作过程中,如果它发现某些情况不被满足(条件不满足无法执行) 它将调用锁对象上的一个wait方法,此时这个线程首先会释放掉锁资源,然后进入到锁对象上的wait set 由于这个线程释放掉了锁资源,使得其他线程可以有机会来竞争这个临界资源 所以其他的线程获得了锁并且进入到临界区域,同时在锁对象上的等待集合中有多条线程在等待条件的满足 当当前运行线程执行完某些操作,需要通知等待的线程时,它调用notify()方法,将会唤醒锁资源所持有的等待集合中一条线程(随机唤醒,由底层算法实现的,无法控制) 使这条线程有机会竞争CPU资源 或者,当当前运行线程调用了notifyAll()方法,将会使当前锁对象上的等待集合中的全部线程都被唤醒,从而有机会在当前线程离开并释放了锁之后,竞争这个临界资源的锁对象查看全部
-
一.互斥 1.同一时间,只能有一个线程访问数据(女神在同一时间只能与一位男主角约会) 二.同步 1.线程的一种通信机制,一个线程完成工作之后通过构建的锁对象调用notifyAll()方 法来唤醒其他线程,以此来完成线程之间的同步 三.步骤 1.互斥 (1)新建一个锁对象(private final Object lockObj = new Object();) (2)通过synchronized(lockObj){ 互斥的代码块 }(synchronized是Java中的关键 字,是一种同步锁) (3)加锁会消耗系统资源,降低效率所以我们通过while循环判断如果条件不通过时, 通过我们创建的锁对象调用wait()方法来阻挡,而不是继续竞争CPU资源,阻挡的 线程会保存在锁对象的Wait set中 2.同步 (1)在某一代码正确执行完业务后,通过lockObj.notifyAll()唤醒所有在lockObj对 象等待的线程查看全部
-
每个线程有三步: 1.加载初值 2.在初值基础上加上转移的能量 3.最后将总值返回写入目标值 总结:CUP的分时与抢占,不能保证三步可以连续完成,从而导致争用条件的发生 线程之间的调度是通过分时和抢占完成的查看全部
-
1.获取线程名称:getName(); 2.取得当前线程对象:currentThread(); 3.判断是否启动:isAlive(); 4.强行运行:join(); 5.线程休眠:sleep(); 6.线程礼让:yield(); 线程停止: 1、调用stop()方法会使线程戛然停止,而无法知道线程任务完成情况,官方已经不推荐使用。 2、interrupt()方法设置线程的标识位,并在线程中判断标志位的状态,从而结束线程,但是当在线程中开启了另外的线程时,比如在线程中Tread.sleep(),这时候调用interrupt()方法设置标志位可能设置的是你想要停止的线程,也可能是想要停止的线程中的线程的标志位,因此interrupt()方法也并不能很好的结束线程。 3、第三种方法,在线程的类声明一个volatile变量来记录线程的状态,相当于interrupt()方法那样,volatile关键字表示线程中的变量可以接受外部其他线程改变。因此可以在需要停止的地方设置volatile声明的变量的值设置为状态,并在执行run()函数里判断是否结束。 什么时候使用thread 什么时候使用runnable 其实两种方式效果一样,但推荐使用runnable 因为Java是单继承,继承了thread就不能继承其他的类 而实现runnable接口的话,扩展性要好很多查看全部
-
1.调用Interrupted方法并不会停止线程,this.inInterrupted接收的是,调用 Interrupted()方法之后,this.inInterrupted得到一个标志(isInterrupted ==>true flase)来判断是否中断线程,跟自己设置Boolean值来判断是否中断线程是一个道理 2.在调用某些特殊的方法时(sleep...),进入一种线程进入一种阻塞状态,再调用 Interrupted方法会抛出异常,this.inInterrupted中断状态被清除,没有办法再来判断 是否停止异常,所以线程将不能被停止查看全部
-
Java5中 并发编程工具查看全部
-
多种模型查看全部
-
一、互斥 1、同一时间,只能有一个线程访问数据 二、同步 1、是一种通信机制,一个线程操作完成后,以某种方式通知其他线程 三、实现方法 1、【互斥】构建锁对象(Object objLock),通过synchronized(lockObj){ 互斥的代码块 } 2、加锁操作会开销系统资源,降低效率。 3、在某线程的条件不满足任务时,使用lockObj.wait()对线程进行阻挡,防止其继续竞争CPU资源,滞留在wait set中,等待唤醒,【唤醒后继续完成业务】 4、【同步】在某一代码正确执行完业务后,通过lockObj.notifyAll()唤醒所有在lockObj对象等待的线程查看全部
-
争用条件查看全部
-
使用退出标志来停止线程查看全部
-
stop方法使得线程突然停止,完成了什么工作,哪些工作还没有完成,都不知道,且没有做清理工作查看全部
-
volatile保证了线程能够正确的读取其他线程写入的值,解决了可见性的问题查看全部
-
stop方法使得线程戛然而止,完成了什么工作,哪些工作还没有完成,都不知道,且没有做清理工作 正确的停止线程的方法,在线程中设置状态标识,通过控制标识来控制线程正常完整的执行结束线程,volatile是保证能够正确接收其他线程传过来的值查看全部
-
1.join()会阻塞其他线程,让调用这个方法的线程先执行完查看全部
举报
0/150
提交
取消