为什么需要Lock锁
1.因为我们需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。
2.通过Lock可以知道线程有没有成功获取到锁
3.Lock锁相当于汽车中的手动挡,相比synchronized更加灵活,轻巧和方便。
4.Lock可以提高多个线程进行读操作的效率。
使用Lock和Condition来替代synchronized和wait(),nofity()来实现同步和进程通信,代码如下
lock锁的通用公式
Lock lock =new Lock();
Condition condition=new Condition
try{
lock.lock;上锁
if(flag){
try{
condition.await
}catch(){
}
}
业务逻辑处理
condition.single();
}catch(){
}finally
{
lock.unlock//释放锁
}
下面用一个具体的例子演示
package com.jerry.Thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//共用资源
class Res {
Lock lock=new ReentrantLock();
public String username;
public String userSex;
public boolean flag=false;
}
//写入资源
class Out extends Thread {
Res res;
Condition condition;//用来进程通信
public Out(Res res,Condition condition) {
this.condition=condition;
this.res = res;
}
public void run() {
int count = 0;
while (true) {
try{
res.lock.lock();//开始上锁
if(res.flag) {
try {
condition.await();//进程等待
} catch (Exception e) {
e.printStackTrace();
}
}
if (count == 0) {
res.username = "jerry";
res.userSex = "boy";
} else {
res.username = "sina";
res.userSex = "girl";
}
//求奇数偶数
count = (count + 1) % 2;
res.flag=true;
condition.signal();//唤醒进程
}catch (Exception ex){
ex.printStackTrace();
}
finally {
res.lock.unlock();//释放锁
}
}
}
}
//读入操作
class Input extends Thread{
Res res;
Condition condition;
public Input(Res res,Condition condition) {
this.condition=condition;
this.res = res;
}
public void run() {
while(true){
try {
res.lock.lock();
if (!res.flag){
try {
condition.await();//等待
}catch (Exception e){
e.printStackTrace();
}
}
System.out.println(res.username+","+res.userSex);
res.flag=false;
condition.signal();//唤醒进程
}catch (Exception ex){
ex.printStackTrace();
}
finally {
res.lock.unlock();
}
}
}
}
public class LockDemo{
public static void main(String[] args) {
Res res =new Res();
Condition condition=res.lock.newCondition();
Out out=new Out(res,condition);
Input input=new Input(res,condition);
out.start();
input.start();
}
}