线程同步[编程语言教程]

线程同步

同步代码块

synchronized(监视器){

//共同享用的代码块

}

多个线程在抢夺cpu执行权,在执行run()方法,遇到synchronized代码块时,会检查是否有锁对象,如果有,就继续执行下去。反则,该线程就会进入阻塞状态。直到锁对象被释放,多个线程就会继续抢夺cpu执行权。

Object obj = new Object();//监视器

public void run() {
?
           while(true){
               synchronized (obj){
                   if(tickets>0) {
                       System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
                       tickets--;
                  }
              }
?
          }
?
  }

同步方法

1.把共同访问的数据总结抽取出来,放进一个方法里面。

2.格式是 :修饰符 synchronized 返回值类型 方法名(参数列表){

//共享的数据;

}

public void run() {
?
       while(true){
           sell();
      }
?
  }
?
   public synchronized  void sell(){
       synchronized (obj){
           if(tickets>0) {
               System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
               tickets--;
          }
      }
  }

使用lock锁

步骤:

1.在成员位置创建一个ReentrantLock对象

2.在可能出现线程安全代码前调用:ReentrantLock的lock()方法。

注:将可能出现线程安全代码放进try{}中

3.在finally{}中调用unlock()

     Lock r =  new ReentrantLock();//1.在成员位置创建一个ReentrantLock对象
   @Override
   public void run() {
?
       while(true){
          r.lock();
          try{
              if(tickets>0) {
                  System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
                  tickets--;
                  }
            }
          finally {
              r.unlock();
              }
?
      }
?

 

线程同步

原文:https://www.cnblogs.com/stydejava/p/13436748.html

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 线程同步