线程安全:当多个线程访问某个类(对象或方法)时,这个类始终能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。
关键字synchronized获得的锁都是对象锁,哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁, 如果有两个对象,线程获得的就是两个不同的锁,且互不影响;如果在静态方法上加synchronized关键字修饰,表示类级别的锁。
使用synchronized关键字加锁,尽量避免对String常量加锁,可能会导致死循环
错误代码示例:
synchronized(“字符串常量”){
//what you want to do ...
}
正确示例:
synchronized(new String("字符串常量")){
//what you want to do ...
}
对象属性值的改变不影响对象的锁;
尽量不要修改锁的内容,会造成无法同步;
示例:
String lock = "lock";
synchronized(lock){
lock = "change lock";
//balabalabala....
}
volatile关键字
作用:使变量在多个线程间可见,不具有原子性
wait方法会释放锁,notify方法不会释放锁‘’
ThreadLocal 用于提供线程变量,只对当前线程可见
单例和多线程 静态内部类方式和double check方式保证线程安全
//静态内部类方式demo
public class InnerSingleton {
private static class Singleton{
private static Singleton singleton = new Singleton();
}
public static Singleton getSingleton(){
return Singleton.singleton;
}
}
//double check方式 demo
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton dcs;
public static DoubleCheckSingleton getDcs() {
if(dcs == null){
synchronized (DoubleCheckSingleton.class){
if(dcs == null){
dcs = new DoubleCheckSingleton();
}
}
}
return dcs;
}
}
单例模式中,饿汉模式同懒汉模式相比,前者不需要care多线程问题,后者则需要使用双重判断加锁的方式,性能稍差;最好的方式为内部类方式,江湖人送外号IoDH,,我也是瞎说的。。。
同步类容器和并发类容器
同步类容器(如:Vector、HashTable)缺点:这些容器的同步功能其实是由Collections.synchronized**()工厂方法创建实现的,其底层机制还是使用传统的synchronized关键字对每个方法进行同步,使得每次只能有一个线程访问。
并发类容器:
Concurrent** 、CopyOnWrite**
ConcurrentHashMap----->采用分段锁(Segment)设计,整体结构类似HashMap的Entry[] 形式,数组中每个元素是个链表,同时又是个重入锁(ReentrantLock)。
ConcurrentSkipListMap----->支持并发排序
CopyOnWrite容器----->读写分离,适合多读少写。
Queue
并发Queue ----- ConcurrentLinkedQueue(这类里的add方法竟然直接调用的offer方法,那还写俩方法干毛线)
阻塞Queue ----- 各种BlockingQueue(ArrayBlockingQueue(有界队列),LinkedBlockingQueue(无界队列),SynchronousQueue(这队列啥玩意也放不进去,可绝了),PriorityBlockingQueue(优先级阻塞队列),DelayQueue(延迟队列))
尚学堂这视频好像讲的有些小毛病,,,以上可能有错。
网友评论