zoukankan      html  css  js  c++  java
  • 多线程编程核心技术学习笔记

    1.线程优先级具有继承性,在当前线程启动新线程,若未指定新线程的优先级,则它的优先级和当前线程一样

    2.典型的守护线程是垃圾回收线程

    3.方法内的变量线程安全,方法外的实例变量非线程安全

    4.1 线程A持有了Object的对象锁,线程B仍然可以调用Object的非synchronized的方法。

    4.2 线程A持有了Object的对象锁,线程B如果这是调用Object对象中的synchorized类型的方法则需要等待,也就是同步

    5. “可重入锁”:自己可以再次获取自己的内部锁,例有一条线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。可重入锁也支持在父子类继承的环境中。

    6.出现异常,锁自动释放

    7.当一个线程访问object的一个同步代码块时(synchronized(this)),其他线程对同一个object中所有其他同步代码块的访问将被阻塞,这说明synchronized使用的对象监视器是同一个。

    8.当不同的线程争抢同一个对象锁时,即使该对象内的属性发生改变,但只要对象不变,运行结果还是同步的

    9.调用lock对象的wait()或者notify()时,该对象必须处于被持有锁的状态(synchronized(lock)),否则将会抛出IllegalMonitorStateException,当调用lock.wait()时,会立即释放lock的锁,当调用lock.notify()时,会等锁区域执行完才释放锁,而等待部分将会仍然处于阻塞状态直到获取到对象锁。

    10.a2.join()方法内部实现时wait,会释放自身对象

    11. InheritableThreadLocal类可以让子线程从父线程中取得值,通过重写InheritableThreadLocal的childValue()方法可以让子线程从父线程继承值的同时再进行修改。需要注意的是,如果子线程在取得值的同时,父线程对InheritableThreadLocal的值进行修改,子线程取到的值还是旧值

    12. 使用ReentrantLock进行锁的同时,用condition实现等待和通知

    13.ReentrantLock的getHoldCount方法是查询当前线程保持此锁定的个数,getQueueLength方法是返回正在等待获取锁定线程的估计数,getWaitQueueLength的作用是返回正在等待的线程数

    14.ReentrantLock的hasQueuedThread(Thread thread)作用是查询指定的线程释放在等待获取此锁定,hasQueuedThreads()作用是查询释放优先从正在等待获取此锁定

    15.ReentrantLock的lockInterruptibly()方法和lock()方法的区别是lockInterruptibly方法可被线程的interrupt()方法中断抛出异常,同时会释放对应锁对象,而lock()方法没有影响

    16.ReentrantReadWriteLock读写锁,读读共享,写写互斥,读写互斥。(有点类似于乐观锁,传统的乐观锁有缺点,可能存在脏读(因为读写不互斥),这种锁的优点是避免了脏读的可能)

    17.TimerTask是以队列的方式一个一个被顺序执行的,所以前面的任务有可能消耗的时间比较长,则后面的任务运行时间会被延时

    18.使用双重检查锁功能,解决单例模式中‘懒汉模式’遇到多线程的问题

    public class MyObject {
        private volatile static MyObject myObject;
        private MyObject(){}
        
        public static MyObject getInstance() {
            try {
                if (myObject == null) {
                    Thread.sleep(3000);
                    synchronized (MyObject.class) {
                         if(myObject == null) {
                              myObject = new MyObject();
                         }
                    }
                }
            } catch (InterruptedException e ) {
                e.printStackTrace();
            }
        }  
    }
    

    19.在实例化一个ThreadGroup线程组x时如果不指定所属线程组,则x线程组自动归到当前线程对象所属的线程组中。

    20.SimpleDateFormat非线程安全,可以用threadlocal解决

    21.可以使用thread.setUncaughtExceptionHandler(new UncaugthExceptionHandler(){})对多线程中发生的异常进行捕捉。

    22.可以使用Thread.setDefaultUncaugthException对所有同类线程对象进行异常捕捉(设置异常处理器)。

  • 相关阅读:
    Linux IO模型
    linux进程管理
    shell之判断文件是否存在
    python之hashlib模块(MD5校验)
    Docker实现退出container后保持继续运行的解决办法
    Pycharm上python运行和unittest运行两种执行方式解析
    Linux du与df命令的差异
    Linux lsof命令详解
    Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
    理解Python中的闭包
  • 原文地址:https://www.cnblogs.com/s648667069/p/10517769.html
Copyright © 2011-2022 走看看