Java——线程同步

格式:
Synchronized(对象){   //让这里的代码变成一个原子操作,不会再代码块的某一个地方切换到其他线程;对象可以是Object
        需同步代码块
}
同步代码块的对象可以是?
需要同步的代码块是?

同步方法2:
格式:把同步关键字加在方法声明前
锁对象:this
public synchronized void sell(){    //run方法里面直接调用
                if(ticket>0){
                        System.out.println(getName()+"卖出第 "+ticket--+" 张票"); 
 //执行这条语句的同时,共享数据自减
                }
        }


同步锁:(对象)
是否可以锁住代码块,要看这几个需要同步的线程是否是在使用同一把锁!!如果是同一把锁,则可以锁住。起到同步的效果
//线程锁
java1.5版本前 ReentrantLock 效率高,不过现在sun优化了 Synchronized底层实现,现在效率差不多。

public class ReentrantLockextends Objectimplements Lock, Serializable
一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 
public class SellTicket implements Runnable {
        Object object=new Object();
        ReentrantLock lock=new ReentrantLock();  //一个可重入的互斥锁 Lock
        int ticket=100;
        public void run() {
                        while(ticket>0){
                                //synchronized(object){ 
                                lock.lock();
                                        if(ticket>0){
                                                System.out.println(Thread.currentThread().getName()+"卖出第 "+ticket--+" 张票");
                                        }       
                                lock.unlock();
                      //}                       
                  }
        }
}









猜你喜欢

转载自www.cnblogs.com/meihao1203/p/9181788.html