一:Lock锁的含义
●Lock也是Java中锁的一大家族。同synchronized一样,保证操作的原子性。
●Lock是一个接口,两个直接实现类:ReentrantLock(重入锁),ReentrantReadWriteLock(读写锁)。
●Lock锁,使用时手动获取锁和释放锁,比synchronized更加灵活;可中断的获取锁;超时获取锁。
●ReentrantLock的底层是AQS队列[Abstract Queued Synchronizer队列同步器],AQS队列的底层是一种先入先出队列。具有可冲入,
公平/非公平锁的特点,其底层具有一种工作窃取算法用来提高工作效率。
非公平锁会抢占锁资源,执行效率会更高。
工作窃取:当一个线程是空闲时,它会监听哪一个线程是繁忙的,主动去帮助繁忙的线程。
●可重入:属于锁的一种特性。线程在完成任务后,会判断是否能够拿到下一次使用资源的机会。如果可以,就继续占用锁(锁的变量自增),不放弃对当前锁的占用。当锁的变量为0时,B和C就可以使用锁了。
●公平/非公平锁:核心的区别就是抢占。
●ReentrantLock和Synchronized的区别:可以实例化对象;含有更多丰富的方法;
二:Lock锁案例
package com.zc;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class Test09 implements Runnable{
Lock lock1=new ReentrantLock();
private int ticketNum=100;
@Override
public void run(){
lock1.lock();
long l1=System.currentTimeMillis();
for(int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+" : "+i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
lock1.unlock();
}
public static void main(String[] args) {
Test09 t1=new Test09();
new Thread(t1,"张丹").start();
new Thread(t1,"李思").start();
new Thread(t1,"王吴").start();
}
}
lock():获得锁
trylock():只有在调用时它不被另一个线程占用才能获取锁。
unlock():线程无响应时,尝试释放此锁。
三:某个Java技术实现线程安全的原理是什么?
》悲观锁ReentrantLock和Synchronized.才能保证原子性操作,创建互斥区。
》还有一些可以向线程安全方向优化的技术。比方说,乐观锁的思想,CAS理论,volatile.