线程

线程

正在运行的程序,也就是占用的内存区域
特点:独立性
      动态性
      并发性

线程

是操作系统能够运行的最小单位,也是进程实际的运作单位,一个进程可以有多个线程,当一个进程只有一个线程时,被称作单线程;当有多个线程时,被称作多线程。

线程

状态:新建  就绪 运行  阻塞 终止
阻塞原因:a等待阻塞-线程处在wait()方法中
         b同步阻塞-线程在获取synchronized同步锁失败,进入同步阻塞
         c其它阻塞-通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

线程比较

image

线程锁

l  Synchronized 互斥锁(悲观锁,有罪假设)
采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。
2  ReentrantReadWriteLock 读写锁(乐观锁,无罪假设)
ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,实际上独占锁是一种相对比较保守的锁策略,在这种情况下任何“读/读”、“读/写”、“写/写”操作都不能同时发生,这在一定程度上降低了吞吐量。然而读操作之间不存在数据竞争问题,如果”读/读”操作能够以共享锁的方式进行,那会进一步提升性能。因此引入了ReentrantReadWriteLock,顾名思义,ReentrantReadWriteLock是Reentrant(可重入)Read(读)Write(写)Lock(锁),我们下面称它为读写锁。
读写锁内部又分为读锁和写锁,读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。读锁和写锁分离从而提升程序性能,读写锁主要应用于读多写少的场景。

守护线程

守护线程为其主线程提供服务,主线程一旦结束,守护线程也就结束
通过isDaemon()来判断一个线程是否是否为守护线程
通过set Daemon()设置线程为守护线程

线程优先级

低优先级:1~4,其中类变量Thread.MIN_PRORITY最低,数值为1;
默认优先级:如果一个线程没有指定优先级,默认优先级为5,由类变量Thread.NORM_PRORITY表示;
  高优先级:6~10,类变量Thread.MAX_PRORITY最高,数值为10。
  setPriority()设置优先级

并行和并发的区别

image
  
    

线程安全

原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作
可见性:一个线程对主内存的修改可以及时地被其他线程看到
有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序

你可能感兴趣的:(java)