package com.huowolf; /* * 有必要加锁的前提是:有多个线程对同一数据进行多行代码操作。 * 检查方法是,1.先找出多个线程执行了那些代码块。 * 2.这些代码中有没有共同(或共享)数据。 * 3.操作该共同数据的代码是否有多行。 * 如果以上三条都满足的话。则必须要加锁(也就是同步代码块或者同步函数)。 * * * 同步函数用的哪一个锁? * 函数需要被对象调用,那么函数都有一个所属对象引用,就是this. * 所以同步函数使用的锁是this * * 同步函数被静态修饰后,使用的锁是什么那? * 使用静态方式,内存中没有本类对象,但是一定有该类对应的字节码文件对象 * 类名.class 该对象的类型是Class * 静态的同步方法,使用的锁是该方法所在类的字节码文件对象。即 类名.class */ class Ticket implements Runnable { private int ticket =100; boolean flag =true; @Override public void run() { if(flag) { while(true) { //同步代码块 synchronized (this) { if(ticket>0) { try {Thread.sleep(10); } catch (Exception e) {} System.out.println(Thread.currentThread().getName()+"代码块..."+ticket--); } } } } else{ while(true){ show();} } } //同步函数 public synchronized void show() { if(ticket>0) { try { Thread.sleep(10); } catch (Exception e) {} System.out.println(Thread.currentThread().getName()+"函数..."+ticket--); } } } public class ThisLockDemo { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); //让主线程睡眠一小会,让t1线程先执行 try {Thread.sleep(10); } catch (Exception e) {} t.flag = false; t2.start(); } }
时间: 2024-11-05 08:46:36