我所知道的高并发

线程的生命周期

NEW(新建状态)
RUNNABLE(运行状态)
BLOCKED(阻赛状态)
WATING(等待状态)
TIMED-WAITING(限时等待状态)
TERMINATED(终止状态)
简单的例子
 Thread t1=new Thread();  #NEW
 t1.start();              有锁 #RUNNABLE; 没锁#BLOCKED
 t1.wait();               #WATING
 t1.notify();             有锁 #RUNNABLE; 没锁#BLOCKED
 t1.wait(1000);           #TIMED-WAITING 等待指定时间后回到#RUNNABLE
 t1.notifyAll();          有锁 #RUNNABLE; 没锁#BLOCKED
 程序执行完毕;              #TERMINATED

新建一个线程在调用start方法前,就是new状态
当调用start方法后就会进入RUNNABLE状态,如果遇到需要锁的情况下,他会进入BLOCKED状态,直到获取到锁之后才会进入RUNNABLE状态
wait和wait(1000)分别会进入WAITING状态和限时TIMED-WAITING状态

volatile

用volatile修饰的变量,当变量被修改后能让其他线程知道这个变量的值已经被修改了
但是并不能代替锁,因为无法保证复合操作的原子性。如:i++;

Object

wait()

wait() 能让当线程停止运行,释放锁,并进入WATING状态
wait(long timeout) 能让当线程停止运行,并进入TIMED-WAITING状态,超过指定时间之后继续运行

notify()

随机唤醒一条队列中的线程

notifyAll()

唤醒所有线程

Thread

sleep(long millis)

属于Thread的静态方法
能使当前线程停止运行指定时间
注意调用该方法并不会释放锁,wait会释放锁

yield()

有AB2条线程,A持有锁,B等待锁,当A释放锁之后,A还可以再次获得锁。
yield方法的作用就是让A暂时不会获得锁,让B或者其他线程先获取

join()

等待线程终止(TERMINATED)
可以理解成该线程终止后,主线程才会继续执行
join(long millis);也可设置等待的时间

interrupt()

中断线程

isInterrupted()

判断线程是否被中断

interrupted()

判断是否被中断,并清除当前中断状态。第一调用放回true,之后都是false

原子变量类

  • AtomicInteger
  • AtomicIntegerArray
  • AtomicReference
  • AtomicIntegerFieldUpdater
  • AtomicReferenceFieldUpdater

锁(用于实现线程之间的同步)

synchronized(内置锁)

synchronized(obj){…}; 进入同步代码块前,需要获得指定对象的锁
作用于实例方法,进入同步代码块前,需要获得当前实例的锁
作用于静态方法,进入同步代码块前,需要获得当前类的锁

ReentrantLock(显示锁)

ReadWriteLock(读写锁)

并发容器

  • CopyOnWriteArrayList
  • CopyOnWriteArraySet
  • ConcurrentHashMap
  • ConcurrentLinkedQueue
  • HashTable
  • Vector

工具类

  • Semaphore
  • CountDownLatch
  • CyclicBarrier
  • FutureTask
  • LockSuporrt

线程池

  • Executor

ThreadLocal

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值