• Java多线程编程<一>


    怎样做到线程安全?

    1、不要跨线程共享变量;

    2、使状态变量为不可变的;

    3、或者在任何访问状态变量的时候使用同步

    同步synchronized

    //静态的synchronized方法从Class对象上获取锁
    
    synchronized(lock){
    
      //访问或修改被锁保护的共享状态
    
    }

    当一个线程请求其他线程已经占用锁时,请求被阻塞,而锁是可以重进入的,因此线程在获取它自己占用的锁时,请求会成功,重进入意味着请求是基于每线程,而不是基于每调用

    重进入方便锁行为封装,下面这个例子能很好理解重进入

    public class Widget {
        
        public synchronized void doSomething(){
            
        }
    
    }
    
    public class ExtendsWidget extends Widget{
        
        public synchronized void doSomething(){
            System.out.println("calling super doSomething");
            super.doSomething();
        }
    
    }

    实例中子类覆写父类synchronized类型方法,并在方法中调用父类的方法,如果没有可重入锁,这段代码就会产生死锁,说明他们拿的是同一把锁。

    Volatile变量

    同步弱形式:volatile变量,它确保对一个变量值得更新告知其他线程,所以当线程访问它的值时总会返回最新值而不是过期值。

    volatile boolean asleep
    ....
        while(!asleep)
            countSomeSheep();

    通常被当作标示完成、中断、状态的标记使用,但是不足以使自增操作(count++)原子化(安全)

    总结:synchronized可以保证可见性与原子性;volatile只能保证可见性;

    只要满足下面所有标准后,才能使用volatile变量:

    1、写入变量时并不依赖当前当前值;或者能够确保只有单一的线程修改变量的值;

    2、变量不需要与其他的状态变量共同参与不变约束;

    3、而且,访问变量时,没有其他的原因需要加锁;

  • 相关阅读:
    Educational Codeforces Round 49 (Rated for Div. 2)
    Codeforces Round #506 (Div. 3)
    multiset
    C++中substr函数的用法
    7.30 背包问题
    7.29 dp动态规划
    7.27 图论 存图 前向星 最短路 dijstra算法 SPFA算法
    7.26 搜索进阶(状压搜索,迭代加深搜索)
    7.23 深搜广搜
    7.24 二分搜索
  • 原文地址:https://www.cnblogs.com/quyongjin/p/3305106.html
Copyright © 2020-2023  润新知