小结6

进程:
程序是静止的,只有真正运行时的程序才被称为进程(任务管理器查看),单核CPU在任何时间点上,只能运行一个进程;宏观并行、微观串行。
DOS命令:wmic下cpu get NumberOfCores 获得真实CPU核数
线程;Thread:
称其为轻量级进程,程序中的一个顺序控制流程,同时也是CPU的基本调度单位。
进程由单个或多个线程组成,彼此间完成不同的工作,交替执行,称为多线程。
线程的组成:
任何一个线程都具有基本的组成部分:
CPU时间片:操作系统(OS)会为每个线程分配执行时间。
运行数据:
堆空间:储存线程需要使用的对象,多个线程可以共享堆中的对象。
栈空间:储存线程需使用的局部变量,每个线程都有独立的栈。
逻辑代码。
线程的创建:
继承Thread将类变为线程,
重写run方法即线程的任务,创建对象调用start启动线程并由JVM默认调用run
实现Runnable,重写run方法,创建实现类对象,创建Thread线程对象传参,调用start方法。
因为以实现接口的方式创建线程实际上是创建当前类编程线程任务类,本身不是线程,
任务是可以多个线程对象共享;也可以继承线程后实现线程表示增加行为能力更灵活,不影响继承。
Thread.currentThread().getName(); //获取线程名字
线程的基本状态:
初始状态:
线程对象的创建,只是在堆开辟内存,与常规对象无异。
就绪状态::
调用start,等待OS选中,并分配时间片。
运行状态:
获得时间片之后,进入运行状态,如果时间片到期,则回到就绪状态
终止状态:
主线程main或独立线程run结束,并释放持有的时间片
有限期等待:
sleep期限内等待。结束后返回就绪状态。
无限期等待:
join插队执行完毕后返回就绪状态。
阻塞状态:
多个线程访问带锁共享实例时,未获得锁线程进入等待状态直至带锁线程释放锁
JDK5之后,就绪状态与运行状态统称Runnable
休眠:
Thread.sleep(long millis)
表示当前线程主动休眠millis毫秒
可设定特定条件下休眠即暂停执行。
放弃:
yield():
主动放弃当前持有的时间片,回到就绪状态,竞争下一下时间片。
结合:
join():
将另一个线程加入到执行线程中中,当前线程进入无限期等待,直至插入线程完成原子操作
在此期间不影响其他线程参与竞争时间片。
线程安全:
线程不安全:
当多线程并发访问临界资源时,如果破坏原子操作,可能造成数据不一致。
临界资源:
共享资源(内存中同一对象),一次仅允许一个线程使用,才可保证其正确性。
原子操作:
不可分割的多部操作,被视为一个整体,其顺序和步骤不可打乱或缺省。
保证线程安全:
写(增、删、改)操作时加锁保证数据的一致(位置的正确、覆盖的避免)
读取操作无需加锁
同步代码块:
synchronized(临界资源对象){//对临界资源对象加锁,不会再被分割,即使休眠也不会释放
//锁,直至原子代码块执行完毕。
//原子操作

、 同一临界资源对象只有一把锁。
每个对象都有一个互斥锁标记,用来分配给线程的。
只有拥有对象互斥锁标记的线程,才能进入该对象加锁的同步代码块
线程退出同步代码块时,会释放持有的锁标记
同步方法:
synchronized 返回值类型 方法名称(形参列表0){ //当前对象(this)加锁
//代码(原子操作)

即将包含原子操作的方法加锁,灵活性较低,其他无区别
注意:
只有在调用包含同步代码块的方法,或同步方法时,才需要对象的锁标记
StringBuffer:
每一个方法都有锁标记,但效率不如Stringbilder
Vector、Hashtable均有synchronized修饰方法
死锁:
当第一个线程拥有A对象锁标记,并等待B对象锁标记,同一时间第二个线程拥有B对象锁标记,并等待A对象锁标记时,产生死锁。
一个线程可以同时拥有多个对象的锁标记,当线程阻塞时,不会释放已经拥有的锁标记,由此可能造成死锁。
生产者、消费者:
在两者之间做一个缓冲区,两者保持同步,即生产者无法向满的缓冲区存放,消费者无法从空缓冲区取
线程通信:
等待:
obj.wait()、obj.wait(long timeout)
主动释放所拥有的锁标记同时阻塞在等待队列,会无限期等待直至被唤醒
唤醒:
obj.notify()、obj.notifyAll()
必须在加锁的同步代码块中,随机唤醒一个正在等待的线程/唤醒全部等待队列
线程池Threadpool:
线程容器,可设定线程的数量上限。Task任务超出限时进入等待状态,直至其他任务释放池中有空余
将预先创建的线程对象存入池中,实现复用线程对象。
简化为new Runnable
获取线程池:
java.util.concurrent;
Executor:
线程池顶级接口,执行已提交的Runnable任务的对象。
execute(Runnable command);
ExecutorService: 线程池接口
submit(Runnable task)
线程池调用并提交一个Runnable对象线程任务用于执行,
并返回Runnable,ExecutorService变量调用
Executors:工具类,通过此类获得线程池。
Executors .newFixedThreadPool(int i):创建一个固定长度的线程池 返回ExecutorService
newCachedThreadPool():获得动态数量的线程池,如不够则延长,无上限。
Callable():相较Runnable方法不用声明异常,但有返回值,其返回值类型为Future
Futurer类型根据Callable参数决定
Future:异步计算的结果,内有get方法获取其结果;以阻塞的形式等待Future中的结果。
· 可用于并发计算,关联线程。
同步:
形容一次方法调用,同步一开始,调用者必须等待方法返回,才能继续,即单条路径
异步:
形容一次方法调用,异步一旦开始,像是一次消息传递,调用者告知告后立刻返回,即多条执行路径
Lock接口:
JDK5加入,应用于高并发,与synchronized比较,具象化显示定义,结构更灵活。
lock():
获取锁
unlock():
释放锁
trylock();
仅在调用时锁为空闲状态才获得锁,返回boolean,不阻塞。
ReentrantLock:
Lock实现类,可重入的互斥锁,synchronized方法均可用,方法更强大。
需手动显示何处获得、何处释放锁,即单独创建一个类
Lock l= new ReentrantLock();
l.lock();l.unlock();
为了保证释放锁可以保证执行,try{}finally{lock.unlock}
重入锁:
在本身持有锁时,未释放时再次获得锁将产生重入锁,
重入锁自身携带计数器,释放时应全部释放
读写锁:
ReentrantTeadWretedLock,支持一写多读的同步锁,读写分离,可分配读写锁
支持多次分配读锁,使多个读操作可以并发执行。
ReadLock、WriteLock读锁、写锁类,内有readLock、writeLovk方法与un
停止线程池
shutfown();但不停止已提交的任务,等已提交任务都执行完毕。
isTerminated():
询问已提交任务是否执行完毕,可配合死循环
CopyOnWriteArrayList:
声明创建CopyOnWriteArrayList,ArrayList的一个线程的变体,add,set都是底层
的新的复制
一个线程安全的ArrayList,加强版读写分离
写有锁,读无锁,读写之间不阻塞,优于读写锁
线程通信
等待:
wait();
必须在对obj(对象)加锁的同步代码块(或同步方法)中,在一个线程执行期间,调用了obj.wait(),该线程会释放所拥有的锁标
记。同时,进入到obj的等待队列中。等待唤醒
通知(唤醒)
notify();、notifyAll();
必须在对obj加锁的同步代码块(或同步方法)中,从obj的Waiting(等待队列)中随机释放一个或全部线程。对自身线程无影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值