`

138_多线程(多线程-同步函数的锁是this)

阅读更多
/*
同步函数用的是哪一个锁呢?
函数需要被对象调用。那么函数都有一个所属对象的引用,就是this
所以同步函数使用的锁是this
*/
class TWindow implements Runnable{
	private int ticketNum =100;
	//Object obj = new Object();
	public void run(){
		while(true){
			this.show();
		}
	}
	public sychronized void show(){
		if(ticketNum > 0){
			try{
					Thread.sleep(10);
			}
			catch(Exception e){
						
			}
			System.out.println(Thread.currentThread().getName()
			+" sale "+ ticketNum--);
		}
	}
}

class ThreadDemo{
	public static void main(String[] args){
		TWindow t = new TWindow();
		
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

/*
通过该程序进行验证:
使用两个线程买票
一个线程在同步代码块中
一个在同步函数中,都在执行买票动作
*/

class TWindow implements Runnable{
	private int ticketNum =100;
	Object obj = new Object();
	boolean flag = true;
	public void run(){
		if(flag){
			while(true){
				sychronized(obj){
					if(ticketNum > 0){
						try{
							Thread.sleep(10);
						}
						catch(Exception e){
									
						}
						System.out.println(Thread.currentThread().getName()
						+" code "+ ticketNum--);
					}					
				}
			}
		}
		else
			while(true)
				show();
	}
	public sychronized void show(){
		if(ticketNum > 0){
			try{
					Thread.sleep(10);
			}
			catch(Exception e){
						
			}
			System.out.println(Thread.currentThread().getName()
			+" sale "+ ticketNum--);
		}
	}
}

class ThreadDemo{
	public static void main(String[] args){
		TWindow t = new TWindow();
		
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		
		t1.start();
		t.flag = false;
		t2.start();
		
	}
}



_________________

如果同步函数被静态static修饰,使用的锁是什么呢?
通过验证,发现不是this,因为静态方法中也不可以定义this。
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码
文件对象:类名.class。该对象的类型是class。

静态的同步方法,使用的锁是该方法所在类的字节码文件对象。也就是
类名.class。
分享到:
评论

相关推荐

    Linux多线程服务端编程:使用muduo C++网络库

    1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . ....

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    Java范例开发大全(全书源程序)

    实例232 多线程同步方法的实例 436 实例233 ATM存取一体机(线程同步互斥) 437 实例234 我的钱哪里去了 440 实例235 门锁打不开了(死锁) 444 实例236 门锁终于被打开了(解决死锁) 446 实例237 一个死锁的...

    java编程基础,应用与实例

    14.7 线程同步 214 14.7.1 同步块 216 14.7.2 同步化方法 219 14.7.3 生产者与消费者 221 14.7.4 多消费者 224 14.8 stop()、suspend()和resume() 225 14.9 巩固练习 226 第15章 常用API之二 228 ...

    Java范例开发大全 (源程序)

     第13章 多线程编程(教学视频:121分钟) 405  13.1 多线程的五种基本状态 405  实例222 启动线程 405  实例223 参赛者的比赛生活(线程休眠唤醒) 407  实例224 资源搜索并下载(线程...

    java范例开发大全(pdf&源码)

    实例232 多线程同步方法的实例 436 实例233 ATM存取一体机(线程同步互斥) 437 实例234 我的钱哪里去了 440 实例235 门锁打不开了(死锁) 444 实例236 门锁终于被打开了(解决死锁) 446 实例237 一个死锁的例子 ...

    java范例开发大全源代码

     实例170 this方法的使用 274  实例171 一张考试成绩单 275  实例172 银行自动存取一体机 278  9.4 多态 284  实例173 饮食文化 284  实例174 使用构造方法的重载计算课程的GPA值 287  第10章 ...

    java范例开发大全

    实例232 多线程同步方法的实例 436 实例233 ATM存取一体机(线程同步互斥) 437 实例234 我的钱哪里去了 440 实例235 门锁打不开了(死锁) 444 实例236 门锁终于被打开了(解决死锁) 446 实例237 一个死锁的例子 ...

    javaSE代码实例

    16.4.3 线程同步调度的方法 362 16.4.4 “生产者-消费者”案例的框架 362 16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 ...

    PaperTest Q&A笔试综述

    5)多进程与多线程的区别….17 6)死锁 17 7〕)进程与线程 18 2. fork ““““““““““““““ 18 3. Linux…………… 20 4, RAID 21 5.测试…. 1面 道面准 21 6.堆栈数据代码区 …22 7.文件...

    C#编程经验技巧宝典

    24 <br>0050 using关键字的用法 24 <br>0051 变量的作用域 25 <br>2.5 其他 26 <br>0052 有效使用this对象 26 <br>0053 如何声明变量 26 <br>0054 如何声明相同类型的多个变量 26 ...

Global site tag (gtag.js) - Google Analytics