美文网首页
线程基础

线程基础

作者: 瓜尔佳_半阙 | 来源:发表于2018-03-12 22:05 被阅读6次

线程安全:当多个线程访问某个类(对象或方法)时,这个类始终能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。
关键字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(延迟队列))

尚学堂这视频好像讲的有些小毛病,,,以上可能有错。

相关文章

网友评论

      本文标题:线程基础

      本文链接:https://www.haomeiwen.com/subject/dvmoaxtx.html