强引用:强引用GC不会回收
软引用:内存够的话不回收,内存不够的话回收
弱引用:不管内存够不够,只要有GC就回收
虚引用:点get是null,但是GC后他会把引用放到引用队列里边
自旋锁:是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。
public class SpinLockDemo {
//原子引用线程
AtomicReference<Thread> atomicReference=new AtomicReference<>();
public static void main(String[] args) throws InterruptedException {
SpinLockDemo spinLockDemo=new SpinLockDemo();
new Thread(()->{
spinLockDemo.myLock();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
spinLockDemo.myUnLock();
},"aa").start();
new Thread(()->{
spinLockDemo.myLock();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
spinLockDemo.myUnLock();
},"bb").start();
}
public void myLock(){
Thread thread=Thread.currentThread();
System.out.println(Thread.currentThread());
while (!atomicReference.compareAndSet(null,thread)){
}
}
public void myUnLock(){
Thread thread=Thread.currentThread();
atomicReference.compareAndSet(thread,null);
System.out.println(Thread.currentThread());
}
}
读锁是共享的不互斥,写锁是互斥的独占的。