首页 > 代码库 > 对多线程的锁的理解

对多线程的锁的理解

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();

	}

}

对多线程的锁的理解