JAVA三种线程锁

内置锁:synchriozed,关键字,同步代码块,object.wait和object.notify/notifyall
显示锁:Lock,JUC包下的类,同步代码块,condition.await和condition.signal/signalall
原子类:Atomic,JUC包下的类,原理CAS,注意ABA问题

Lock接口方法有lock、unlock、trylock、newCondition
try {
    lock.lock();
    System.out.println( lock.tryLock());
    System.out.println( lock.tryLock(1000, TimeUnit.MILLISECONDS));
} catch (InterruptedException e) {
    e.printStackTrace();
} finally {
    lock.unlock();
}

Condition.await与Object.wait区别

1、Condition.await持有的是Lock锁,Object.wait持有的是synchronized锁,都是阻塞当前线程
2、唤醒lock锁用的是Condition.signal和signalAll,唤醒synchronized锁用的是Object.notify和notifyAll
3、Condition.await、Condition.signalAll需要与Lock配合使用,Object.wait、Object.notifyAll需要与synchronized配合使用,不能单独使用

synchronized与lock区别

1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
2.synchronized在线程执行结束或抛出异常后自动释放锁,Lock必须在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
3.lock功能比synchronized功能强大,可以尝试获取锁,还有一些实现类,像读写锁等
4.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可中断、可公平(两者皆可)
指定公平锁Lock lock = new ReentrantLock(true)
5.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

Callable与Runnable的区别

相同点:都是在线程中被执行;

不同点:Callable在线程中执行的接口是call,能对外抛出异常,且有返回值;Runnable在线程中执行的接口是run,不能对外抛出异常,且没有返回值

JAVA三种线程锁_第1张图片

JAVA三种线程锁_第2张图片 

Future线程

Future线程:可以获取线程的执行结果,判断线程是否执行结束、中断执行中的线程
FutureTask是Runable和Future接口的实现类

线程一般要求快进快出

 

你可能感兴趣的:(线程锁,lock,synchronized,atomic,juc)