<黑马程序员>关于线程锁的使用

------- android培训java培训、期待与您交流! ----------


之前学习JAVA,对多线程的处理,一直使用synchronized,但看完1.5的特性之后,学会了使用LOCK替代synchroized,更灵活方便一些。

那么下面就对lock的用法用程序说明一下:

Lock_cuser类

package com.thread.lock;


import java.util.concurrent.locks.*;
/*
 * 1、JDK1.5更新功能,使用LOCK替代 synchronized
 * 2、优点:每一个锁可以创建多个钥匙
 * */

public class Lock_cuser {
	private String name;
	private String sex;
	private boolean flag = false;
	Lock lk = new ReentrantLock();//实现Lock借口的ReentrantLock()对象
	Condition cond1 =lk.newCondition();//创建一把钥匙
	Condition cond2 =lk.newCondition();//又创建一把钥匙
	public void set(String name, String sex){
		lk.lock();
		try{
			while(flag)
				try {
					cond1.await();//cond1线程等待
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			this.name = name;
			this.sex = sex;
			flag = true;
			cond2.signalAll();//唤醒所有cond2线程
			
		}finally{
			lk.unlock();
		}

			
	}
	
	public  void put(){
		lk.lock();
		try{
			while(!flag)
				try {
					cond2.await();//cond2线程等待
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			System.out.println(".....姓名:"+name+"....性别"+sex);
			flag = false;
			cond1.signalAll();//唤醒所有cond1线程
		}finally{
			lk.unlock();//释放锁
		}
	}

}


Lock_thread类

package com.thread.lock;

public class Lock_thread implements Runnable{
	Lock_cuser i;
	Lock_thread(Lock_cuser i){
		this.i = i;
	}
	public  void run(){
		int t = 0;
		while(true){
			if(t == 0)
				i.set("zhang san", "nan");
			else
				i.set("李四", "女");	
			t = (t+1)%2;
		}
			
	}
}

class Lock_thread_out implements Runnable{
	Lock_cuser i;
	Lock_thread_out(Lock_cuser i){
		this.i = i;
	}
	public void run(){
		while(true){
			i.put();	
		}
		
	}
}


主函数Lock_main类

package com.thread.lock;


public class Lock_main {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Lock_cuser l = new Lock_cuser();
		Lock_thread lt1 = new Lock_thread(l);
		Lock_thread_out lt2 = new Lock_thread_out(l);
		
		Thread t1 = new Thread(lt1);
		Thread t2 = new Thread(lt2);
		Thread t3 = new Thread(lt1);
		Thread t4 = new Thread(lt2);
		
		t1.start();
		t2.start();
		t3.start();
	    t4.start();
	}


}


 -------android培训JAVA培训、期待与您交流! ----------

--------详细请查看www.itheima.com-------------


黑马程序员多线程练习题主要包括两个问题。第一个问题是如何控制四个线程在打印log之前能够同时开始等待1秒钟。一种解决思路是在线程的run方法中调用parseLog方法,并使用Thread.sleep方法让线程等待1秒钟。另一种解决思路是使用线程池,将线程数量固定为4个,并将每个调用parseLog方法的语句封装为一个Runnable对象,然后提交到线程池中。这样可以实现一秒钟打印4行日志,4秒钟打印16条日志的需求。 第二个问题是如何修改代码,使得几个线程调用TestDo.doSome(key, value)方法时,如果传递进去的key相等(equals比较为true),则这几个线程应互斥排队输出结果。一种解决方法是使用synchronized关键字来实现线程的互斥排队输出。通过给TestDo.doSome方法添加synchronized关键字,可以确保同一时间只有一个线程能够执行该方法,从而实现线程的互斥输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [黑马程序员——多线程10:多线程相关练习](https://blog.csdn.net/axr1985lazy/article/details/48186039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值