`
interzz
  • 浏览: 9887 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

多线程编程点滴&volatile

 
阅读更多
为什么基于多线程的程序会出现同步问题,根源在于多个程序之间会共享数据,没有数据共享的或只共享只读数据的多线程程序是不需要去考虑同步的.而现实中这样的状态比较少见,常见的多线程都会读写共享数据,基于此,就需要对涉及到共享数据操作的方法进行同步,何为同步就是依靠一定的机制让线程按照次序来操作数据,防止出现读脏数据等情况出现.类似常见的存取款程序,必须严格控制账户这个共享信息的访问次序.

所以要正确的编写多线程程序,控制共享数据的同步就成了最核心的问题,因为CPU的控制权是针对线程来分时的,所以各个线程的执行次序是不可预知的.所以采用lock来实现对共享数据的独占成为解决同步问题的一个普遍做法.

设计实现多线程程序中,考虑的首要问题就是要处理好共享数据的同步,根据具体的业务制定具体的同步锁粒度,力争达到安全和性能的最大化.


Java中的Volitile关键字保证被它修饰的变量只存在于主内存中,各线程不持有本地版本,这就保证了该数据的可见性,另外volatile还能保证它修饰的基本变量的加载与存储操作都是原子的.
注意对其余复杂操作 比如 i++不能保证原子性

##程序中只有一个锁也可能出现死锁

boolean isDone = false;
public synchronized void run(){
    while(!isDone){
       //do sth
    }

}

public void setDone(){
  isDone = true;
}

##线程互相等待对方已经持有的锁,形成等待环

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics