美文网首页
线程基础

线程基础

作者: 瓜尔佳_半阙 | 来源:发表于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