Java并发

长期等待之后,正在等待的线程可以中断等待,去执行其他的事情。Synchronized不可中断,锁可以中断。但是lock()不会中断,tryLock()可以

Executor用shutdown等所有线程都执行完关闭。shutdownNow是调用每个线程得interrupt()
Executor用execute(线程)开始,也可用submit(线程)提交线程并返回一个Future对象,这个对象可以用.cancel(true)来结束。

Synchronized锁对代码块(synchronized(this){代码块})和方法(public synchronized void method)加锁,同一个类的不同对象不会被锁。
但如果对类加锁(synchronized(xx.class){代码块}),就会锁住这个类的这一块,不同的实例对象会被加锁。
同时,如果方法是静态方法,也会对所有实例对象加锁。(因为静态方法只有一个,在第一次初始化的时候出现啊啊啊)。

不使用lock的高级功能就使用synchronized。因为前者是JDK支持的,每个JDK版本不一样可能有不同,但是synchronized是JVM支持的,而且synchronized还能确保锁的释放。Lock要自己释放。

wait会释放锁,sleep不会
通过对象名.sleep()想让该对象线程进入休眠是无效的,它只会让当前线程进入休眠。
wai()是Object类提供的,一般与synchronized联合使用。调用wait之后会释放锁,导致线程等待。唤醒进程使用notify()或者notifyAll()
await()是Condition类当中的,一般与Lock联合使用,因为要确认是哪个condition被阻塞,lock是锁住了condition,也就变相确认了await的condition。但是一个lock可以锁住多个condition。唤醒用signal或signalAll
直接wait相当于是synchronized(obj),然后obj.wait,这个obj是这个类的对象;是synchronized(lock)的一个特例算是

AQS虚拟队列同步装置

CountDownLatch,CyclicBarrier,Semaphore,ForkJoin
Semaphore和信号量差不多

FutureTask用实例.get()方法获得返回值

BlockingQueue用take()和put(),不是get()和put()。BlockingQueue是个接口,要用实现的类去实例化,比如ArrayBlockingQueue(定长)或者LinkedBlockingQueue(不定长)。PriorityBlockingQueue(有优先级)

volatile能保证内存模型的可见性,但是不能保证原子性。Volatile,synchronized,final

三种可见性保证,

有序性分两块,一块是本线程看本线程操作全有序,另一块是本线程看其他线程内操作全无序。
为了保证内存模型的有序性,可以使用volatile和synchronized控制,同时JVM还有一个先行发生原则,让一个操作无需控制就能先于另一个操作执行。先行发生原则有好多子原则。

线程安全(不可变,阻塞同步,非阻塞同步,不涉及共享数据)

不可变的对象一定线程安全(枚举,final,string,Collections.unmodifiableXXX)

Collections.unmodifiableXXX可以把一个可修改的传入返回一个新的不能修改的容器,如
Map<K,P> map = new HashMap<K,P>(); Map<K,P> bunengbianMap = Collections.unmodifiableMap(map);

CAS可能带来ABA问题。

自旋锁,锁消除,锁粗化,轻量级锁(使用CAS),偏向锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值