java 多线程锁详解

1.线程池

使用线程池是复用线程,节省创建线程的时间。在java中主要使用的线程是threadPoolExecutor,此外还有ScheduledThreadPoolExecutor定时线程池。需要注意的是Executors.newCacheThreadPool()方法返回的线程池,该线程池是没有线程上限的,而每个线程都是消耗内存的,这会导致过多的内存被占用。


2.synchronized 锁

用于声明方法和代码块。

synchronized(this)和synchronized(demo.class)的区别?

this是针对一个对象的即成员方法互斥,demo.class是针对静态方法互斥的


3.ReentranLock

ReentranLock是java.util.concurrent.locks中的一个类,他是用于修饰代码块的,不过要显示的进行unlock,一般我们放在finally中。ReentranLock提供了tryLock方法,在tryLock调用的时候,如果锁被其他线程持有,那么会立即返回false,如果没有当前线程会持有锁,并且tryLock返回true。

此外ReentranLock也提供了读写锁ReentrantReadWriteLock用于读多写少的并且读不需要互斥的场景。


4.volatile关键字

volatile保证了在多线程中所修饰变量的可见性。


5.Atomics

在jdk5增加了java.util.concurren.atomic包,这些类主要提供一些相关的原子操作。例如:AtomicInteger等等


6.wait,notify和notifyAll

这三个是java object对象的三个方法,wait是进行等待,notify是唤醒一个线程,notifyAll是唤醒所有线程。在实践中wait一般用于一个循环中。


7.countDownLatch

它是java.util.concurrent包中的一个类。countDownLatch主要提供的机制是当多个线程都达到了预期状态或完成预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作。到达自己预期的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法。


8.cyclicBarrier

是循环屏障,CyclicBarrier可以协同多个线程,让多个线程都在这个屏障前等待,直到所有的线程都到达了这个屏障时,再一起继续执行后面的动作。


9.Semaphore

信号量对象管理的信号就像令牌,通过acquire获取令牌,通过release释放令牌,他可以控制并发的数量。


10.Exchanger

exchanger用于在两个线程之间进行数据交换,线程会阻塞在Exchanger的exchange方法上,直到另外一个线程也到了同一个exchanger的exchange方法上,二者数据进行交换,然后两个线程继续执行自身相关的操作。


11.future和futureTask

Future是一个接口,FutureTask是一个具体实现类。他的作用是在一个串行接口中有一个方法调用远程接口,这个远程接口返回的比较慢而且返回值这个接口用不到,导致整个接口慢。这时就可以用future<Object> future = getDataFromRemote(); Objcet data = (Object)future.get();返回值data要用的时候就可以动get方法获取。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值