对多线程的锁的理解

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

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值