多线程

一个cpu同一时间,只能执行一个命令

yield() 该线程释放cpu的执行权,让步与其他线程,自己稍后执行

join()   A线程中调用B线程的jion(),表示,A线程执行到此停止执行,知道B线程执行完毕,A线程再继续执行

isAlive() 判断当前线程是否还存活

sleep(long 1) 显式的让当前线程睡眠  1毫秒

 

多线程实现的方式

1-extends Thread

2-implements Runnable

  优点:

    1-可以多实现

    2-便于多线程操作同一份资源

 

同步监视器:由类的对象充当,获取监视器的线程就执行同步代码块

 

使用单线程完成多个任务 比 使用多线程完成多个任务时间要短(因为多了个cpu切换的时间),为什么还要使用多线程?

1-用户体验,提高应用程序响应

2-提高cpu的利用率

3-改善程序结构,将复杂的进程,拆分为多个线程,独立运行,利于理解和修改

 

线程分类:1-用户线程   2-守护线程

 

线程的生命周期: 新建,就绪,运行,死亡,阻塞

 

 

是否释放锁:

  不会:sleep();yield();

  会:  break;return;wait();未处理的Error和Exception;

  

死锁:不同线程分别占用彼此需要的共享资源不放弃,都在等待对方释放自己需要的资源。

解决:1-尽量减少同步定义

    2-专门的算法和原则

 

线程通信:

  以下方法均定义在基类Object对象中,并且只能在同步代码块或同步方法中使用。 否则异常IllegalMonitorStateException

  wait();  挂起当前线程,并放弃CUP、同步的共享资源,等到被别的线程唤醒后再继续操作

  notify(): 唤醒等待线程中优先级最高的一条线程

  notifyAll(): 唤醒所有等待的线程集

 

 

JUC高级:

内存可见性问题:

1-volatile: 内存可见性,多个线程操作共享数据,保证内存数据可见   ;volatile-不具备互斥性,不能保证原子性

 

原子性问题:

2-原子变量与CAS算法

  典型问题:i++   读-改-写   三个步骤

 原子变量:volatile保证内存可见性

      CAS(compare and swap)算法保证数据的原子性

 

 

3-同步的第三种方法--显式同步锁  Lock    =new ReentrantLock();   lock.lock(); lock.unlock();

   同步条件  Condition =lock.newCondition();    condition.await();  condition.signal(); condition.signalAll();

同一个对象中多个方法都加了synchronized关键字的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法,即同步的,阻塞的;


线程调度的疑问:
同一个对象中多个方法都使用同一把lock锁的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法吗?



 

posted @ 2019-04-21 15:57  魔杰Lee  阅读(149)  评论(0编辑  收藏  举报