-
加锁标准写法查看全部
-
1.互斥的实现:对关键数据加锁 2.同步的实现:wait(),notify(),notifyAll()--Object 3.Wait Set: 类似于线程的休息室,访问共享数据的代码称为critical section(锁资源)。一个线程获取锁,然后进入临界区 ,发现某些条件不满足,然后调用锁对象上的wait方法,然后线程释放掉锁资源,进入锁对象上的wait set。其他线程可以获取锁资源,执行,以后调用notify(唤醒某个wait set中的线程)/notifyAll(唤醒wait set中的所有线程),通知锁对象上的等待线程。查看全部
-
一、互斥 1、同一时间,只能有一个线程访问数据 二、同步 1、是一种通信机制,一个线程操作完成后,以某种方式通知其他线程 三、实现方法 1、【互斥】构建锁对象(Object objLock),通过synchronized(lockObj){ 互斥的代码块 } 2、加锁操作会开销系统资源,降低效率。 3、在某线程的条件不满足任务时,使用lockObj.wait()对线程进行阻挡,防止其继续竞争CPU资源,滞留在wait set中,等待唤醒,【唤醒后继续完成业务】 4、【同步】在某一代码正确执行完业务后,通过lockObj.notifyAll()唤醒所有在lockObj对象等待的线程查看全部
-
当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏(corrupted),这种现象称为争用条件 原因是,每个线程在操作数据时,会先将数据初值读【取到自己获得的内存中】,然后在内存中进行运算后,重新赋值到数据。查看全部
-
为什么不能使用interrupt方法来终止线程:因为在线程调用(),join(),sleep()等阻塞的方法的时候会清除当前线程的interrupted status,当该线程再调用isInterrupted()和interrupted()方法时就会抛出异常。 广为流传的错误停止线程的方法:interrupt() interrupt()--初衷并不是用于停止线程 在调用sleep()或者join()的时候,一旦其他线程调用interrupt(),它将会收到一个异常,这些被阻塞的线程因为某些原因需要被唤醒,比如外部发生了中断而需要响应,这时就采用抛出异常的方式来使其作出响应。总而言之,interrupt()方法并不能正确地停止进程 当前线程值是否被中断,isInterrupted()和interrupted() 当线程正在处于某些方法中,如sleep(),,会出现两种情况: 1.sleep方法受到interrupt异常; 2.interrupt状态被清空查看全部
-
一、错误一:stop()方法 1、not stop:stop()方法会使线程戛然而止 2、使程序突然中止,无法完成完整的业务步骤,也无法进行清理工作 二、错误二:interrupt()方法 1、interrupt()方法只能设置interrupt标志位(且在线程阻塞情况下,标志位会被清除,更无法设置中断标志位),无法停止线程 三、正确方法:设置退出标志 1、使用退出标志位来停止while循环 2、完成最后一次业务后跳出while循环后,之后进行一些清理工作查看全部
-
如何正确停止线程? --使用退出标志 如本文:volatile boolean keepRunning=true; 这样做的好处是:使得线程有机会使得一个完整的业务步骤被完整地执行,在执行完业务步骤后有充分的时间去做代码的清理工作,使得线程代码在实际中更安全查看全部
-
不能用stop停止正在执行的线程,否则会让程序戛然而止,导致有些工作还没有完成程序就终止运行。查看全部
-
只可以有一个public类查看全部
-
thread常用方法查看全部
-
并发模型查看全部
-
volatile使变量可及, .join()让线程等待查看全部
-
有意思!!!查看全部
-
两种方法实现线程: 1、继承 Thread 类 class MyThread extends Thread{}; Thread myThread = new MyThread(); myThread.start(); 2、实现Runnable类 class MyRunnable implements Runnable{} Thread myRunnable = new Thread(new MyRunnable); myRunnable.start(); 3、Thread启动后执行run()方法 4、Thread.currentThread().getName()方法获取当前线程名称查看全部
-
thread常用方法查看全部
举报
0/150
提交
取消