多线程
一个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锁的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法吗?