JAVA知识点:
(掌握)StringBuilder、StringBuffer 和 String
StringBuilder:非线程安全,执行效率高,适用于--单线程操作字符串缓冲区下操作大量数据
StringBuffer:线程那全,执行效率低(所有方法都加上了“synchronized”关键字),适用于--多线程操作字符串缓冲区下操作大量数据
String:每次处理对象,都需要在栈内开辟新空间,且使用后,原空间没有了指向关系,被丢弃,大量浪费了内存资源,适用于--操作少量的数据时
掘金相关文章讲解:StringBuilder为什么线程不安全:https://juejin.im/post/5d6228046fb9a06add4e37fe
(掌握)synchronized:
同步锁-->
1、对象锁(将关键词加在方法上,作用范围是当前对象),如public synchronized void Demo(){}
同步方法(对象锁)通过ACC_SYNCHRONIZED关键字隐式的对方法进行加锁。当线程要执行的方法被标注上ACC_SYNCHRONIZED时,需要先获得锁才能执行该方法。
2、类锁(全局锁,将关键词加在代码块上),如public void Demo(){synchronized (类名.Class){}}
同步代码块(类锁)通过monitorenter和monitorexit执行来进行加锁。当线程执行到monitorenter的时候要先获得所锁,才能执行后面的方法。当线程执行到monitorexit的时候则要释放锁。每个对象自身维护这一个被加锁次数的计数器,当计数器数字为0时表示可以被任意线程获得锁。当计数器不为0时,只有获得锁的线程才能再次获得锁。即可重入锁。
CSDN相关文章讲解Synchronized、Lock和Atomic性能测试:https://blog.csdn.net/minaki_/article/details/88810301
JDK1.6后,对synchronized进行优化,分成四种锁状态:无锁状态、偏向锁、轻量级锁、重量级锁
其中偏向锁默认开启,可以通过UseBiasedLocking进行控制偏向锁的开启和关闭
后三种锁,是在特定条件下,进行升级操作:多线程 访问 偏向锁,判断当存在锁竞争时,升级为轻量级锁,再次判断存在锁竞争时,然后发生锁膨胀,升级为重量级锁