标签:16px sync font 实例 标记 类的方法 关键字 基于 分配
Synchronized和ReentrantLock区别?
1.Synchronized基于操作 MarkWord,ReentrantLock 调用Unsafe类的方法
2.ReentrantLock可以对获取锁的等待时间进行设置,避免死锁
3.ReentrantLock可以实现公平,非公平锁
4.ReentrantLock配合condition可以实现更加精确的线程控制
5.Synchronized无需进行锁的释放,ReentrantLock需要进行锁的释放
synchronized的线程同步在JVM层面,通过字节码中的monitorenter和monitorexit指令。
public void test(Object lock){
synchronized (lock){
lock.toString();
}
}
锁优化的方案?
1.降低锁的时间(只需要在有线程安全要求的程序代码上加锁,而不是整个代码块加)
2.降低锁的细粒度(之前的ConcurrentHashMap通过减少锁的细粒度,提升性能)
3.读写分离(应用系统中,读操作次数远远大于写操作)
4.锁的粗化(通过把synchronized加载for循环外,避免每次for循环都涉及线程的切换)
5.锁消除(StringBuffer是一个局部变量,堆栈封闭,方法没有把StringBuffer返回,所以不可能会有多线程去访问它。
当我们在一些不会有线程安全的情况下使用这些类的方法时,达到某些条件时,编译器会将锁消除来提高性能。)
标签:16px sync font 实例 标记 类的方法 关键字 基于 分配
原文地址:https://www.cnblogs.com/Jemb/p/11617145.html