/*
第一种案例
*/
public classSellTicketDemo { publicstatic void main(String[] args) { // 创建资源对象 SellTicketst = new SellTicket(); // 创建三个线程对象 Thread t1 = new Thread(st, "窗口1"); Thread t2 = new Thread(st, "窗口2"); Thread t3 = new Thread(st, "窗口3"); // 启动线程 t1.start(); t2.start(); t3.start(); } } public classSellTicket implements Runnable { // 定义100张票 privateint tickets = 100; // 定义同一把锁 privateDemo d = new Demo(); private int x=0; //同步代码块用任意对象做锁 @Override publicvoid run() { while(true) { if(x%2==0){ synchronized (this){ if(tickets > 0) { try{ Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票"); } } }else{ sellTicket();//如果这样都是没什么问题 } x++; } } //如果一个方法一进去就看到了代码被同步了,那么我就在想能不能把这个同步加在方法上呢? private synchronized void sellTicket(){ if(tickets > 0) { try{ Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票"); } }
} /* 第2种方式 */ public classSellTicketDemo { publicstatic void main(String[] args) { // 创建资源对象 SellTicketst = new SellTicket(); // 创建三个线程对象 Thread t1 = new Thread(st, "窗口1"); Thread t2 = new Thread(st, "窗口2"); Thread t3 = new Thread(st, "窗口3"); // 启动线程 t1.start(); t2.start(); t3.start(); } } public classSellTicket implements Runnable { // 定义100张票 privatestatic int tickets = 100; // 定义同一把锁 privateDemo d = new Demo(); private int x=0; //同步代码块用任意对象做锁 @Override publicvoid run() { while(true) { if(x%2==0){ synchronized (SellTicket .class) { if(tickets > 0) { try{ Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票"); } } }else{ sellTicket();//如果这样都是没什么问题 } x++; } } //如果一个方法一进去就看到了代码被同步了,那么我就在想能不能把这个同步加在方法上呢? private static synchronized void sellTicket(){ if(tickets > 0) { try{ Thread.sleep(100); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售第" + (tickets--) + "张票"); } }
} synchronized有2种方式:一种是同步代码块,另一种是同步方法.而最重要的是sybchronized的锁是什么对象?一般都是所在的类 同步代码块和同步方法不是互不干涉的.
1.synchronized(this)对应的是类中的public synchronized void xxxx().
2.synchronized(类.class)对应的是类中的public static synchronized void xxxx().
如果有这2种对应的话,就会互相干扰
|