-
通过synchronized关键字为临界区(critical)加锁,这样在线程竞争资源时,当某一条线程获得锁进入临界区后,其他线程将无法再次获取锁进入临界区(critical),直到获得锁的线程退出临界区(critical),释放锁资源。查看全部
-
Java线程——线程交互——互斥与同步 一、互斥 1、同一时间,只能有一个线程访问数据 二、同步 1、是一种通信机制,一个线程操作完成后,以某种方式通知其他线程 三、实现方法 1、【互斥】构建锁对象(Object objLock),通过synchronized(lockObj){ 互斥的代码块 } 2、加锁操作会开销系统资源,降低效率。 3、在某线程的条件不满足任务时,使用lockObj.wait()对线程进行阻挡,防止其继续竞争CPU资源,滞留在wait set中,等待唤醒,【唤醒后继续完成业务】 4、【同步】在某一代码正确执行完业务后,通过lockObj.notifyAll()唤醒所有在lockObj对象等待的线程查看全部
-
争用条件示例:查看全部
-
Java线程——线程交互——争用条件 1、当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏(corrupted),这种现象称为争用条件 2、原因是,每个线程在操作数据时,会先将数据初值读【取到自己获得的内存中】,然后在内存中进行运算后,重新赋值到数据。 3、争用条件:线程1在还【未重新将值赋回去时】,线程1阻塞,线程2开始访问该数据,然后进行了修改,之后被阻塞的线程1再获得资源,而将之前计算的值覆盖掉线程2所修改的值,就出现了数据丢失情况查看全部
-
interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态,然后该线程还是继续运行的查看全部
-
如何正确停止线程? --使用退出标志 如本例:volatile boolean keepRunning=true; 这样做的好处是:使得线程有机会使得一个完整的业务步骤被完整地执行,在执行完业务步骤后有充分的时间去做代码的清理工作,使得线程代码在实际中更安全查看全部
-
线程执行过程中几个重要的方法 sleep(); 让线程休眠一段时间, yield(); 让出当前线程的执行权限,让线程调度重新选择线程进行执行; join(); 让其他线程都停止,等待当前线程执行完毕。查看全部
-
注:必须将keepRunning变量声明为volatile JMM提供了volatile变量定义、final、synchronized块来保证可见性。 例如:线程a在将共享变量x=1写入主内存的时候,如何保证线程b读取共享变量x的值为1,这就是JMM做的事情。JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证。查看全部
-
每一个java文件中只能有一个public类 两种方法实现线程: 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则getName()方法获取当前线程。查看全部
-
后期学习!!!!!!!!!!!!!!!!! JMM、Locks&Condition类、线程安全性(原子性与可见性编程)、死锁、交互模型(Producer-Consumer模型、Read-Write Lcok模型、Futura模型、Worker Thread模型)、并发编程工具查看全部
-
wait set 类似于线程的休息室,访问共享数据的代码称为critical section。一个线程获取锁,然后进入临界区 ,发现某些条件不满足,然后调用锁对象上的wait方法,然后线程释放掉锁资源,进入锁对象上的wait set。其他线程可以获取所资源,然后执行,完了以后调用notify,通知锁对象上的等待线程。 注意:notify();方法唤醒wait set 中的一条线程使其具有竞争CPU的机会,具体唤醒哪一条线程是随机的由Java的底层算法决定,我们不能去控制。 通过synchronized关键字为临界区(critical)加锁,这样在线程竞争资源时,当某一条线程获得锁进入临界区后,其他线程将无法再次获取锁进入临界区(critical),直到获得锁的线程退出临界区(critical),释放锁资源。Java的语法保证了同一时间只能有一条线程可以获得LockObj。通过.wait()方法释放锁。通过.notify()通知可以争夺锁。查看全部
-
同步的实现:查看全部
-
互斥的实现:查看全部
-
实现互斥与同步: 1、private final Objecct LockObj = new Object(); 2、synchronized(LockObject){需要互斥操作的代码}。将LockObj锁定起来,只有持有LockObj的线程才能访问代码。 3、优化性能,让不满足条件的线程等待一段时间,而不重复使用cpu。while(条件){LockObj.wait();}通过.wait()方法释放锁。 4、当线程满足条件(没有执行LcokObj.wait()),在主代码执行完毕后,加上LockObj.notifyAll()来唤醒全部执行了LockObj.wait()的线程。查看全部
-
Thread类的常用方法:查看全部
举报
0/150
提交
取消