9-4

同步的两种表现形式:
1.同步代码块
   synchronized(对象){

       需要同步的代码
}

2.同步函数: 使用的锁是this
  public synchronized void show(){
}
同步的作用:避免线程的安全隐患
单例

懒汉式
class Single{
   private static Single s=null;
   private Single(){}
   public static Single getInstance(){
       if(s==null)
          synchronized(Singel。class){
             if(s==null)
              s=new Single();
         }
         return s;
}
class Single{
   private static Single s=null;
   private Single(){}
   public static synchronized Single getInstance(){

          if(s==null)
              s=new Single();
     
         return s;

}

Single。getInstance();
饿汉式
class Single{
   private static Single s=new Single();
   private Single(){}
   public static Single getInstance(){
         return s;
}

}

线程的同步
为什么需要“线程同步”
线程间共享代码和数据可以节省系统开销,提高程序运行效率,但同时也导致了 数据的 访问冲突 问题,如何实现线程间的有机交互、并确保共享资源在某些关键时段只能被一个线程访问,即所谓的“线程同步”(Synchronization)就变得至关重要。
临界资源
多个线程间共享的数据称为临界资源(Critical Resource),由于是线程调度器负责线程的调度,程序员无法精确控制多线程的交替顺序。因此,多线程对临界资源的访问有时会导致数据的不一致行。

互斥锁
每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
Java对象默认是可以被多个线程共用的,只是在需要时才启动“互斥锁”机制,成为专用对象。
关键字synchronized用来与对象的互斥锁联系
当某个对象用synchronized修饰时,表明该对象已启动“互斥锁”机制,在任一时刻只能由一个线程访问,即使该线程出现堵塞,该对象的被锁定状态也不会解除,其他线程任不能访问该对象。

死锁
两个线程A、B用到同一个对象s(s为共享资源),且线程A在执行中要用到B运行后所创造的条件。在这种前提下A先开始运行,进入同步块后,对象s被锁定,接着线程A因等待B运行结束而进入阻塞状态,于是B开始运行,但因无法访问对象s,线程B也进入阻塞状态,等待s被线程A解锁。最终的结果:两个线程互相等待,都无法运行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值