多线程(Java)之Lock接口

多线程之Lock接口

上一篇文章讲述了多线程的概念和同步代码块来解决多线程造成的问题。

https://mp.csdn.net/postedit/102060855

如果想要解决多线程访问多行代码涉及操作同一变脸造成的问题时,在JDK1.5之后推出了新的API来解决这个问题。

就是Lock接口

将上一篇文章里的synchronize替换为Lock

package com.evan.counter;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test {

	public static void main(String[] args) {
		Resource resource = new Resource();
		MyRunnable runnable = new MyRunnable(resource);
		Thread t1 = new Thread(runnable);
		Thread t2 = new Thread(runnable);
		Thread t3 = new Thread(runnable);
		Thread t4 = new Thread(runnable);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

class Resource{
	private int count = 100;
	private Lock lock = new ReentrantLock();
	
	public void mute() {
		try {
			lock.lock();
			if(count > 0) {
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				count--;
				System.out.println("Count: " + count);
			}
		}catch(Exception e) {
			
		}finally {
			lock.unlock();
		}
	}
}

class MyRunnable implements Runnable{
	private Resource resource;
	
	public MyRunnable(Resource resource) {
		super();
		this.resource = resource;
	}

	@Override
	public void run() {
		//要执行的代码
		while(true) {
			resource.mute();
		}
	}
}

 

 

Lock接口的常用方法:

  1.  lock() 获取锁,并锁定。
  2.  tryLock() 在调用时,如果没有现成使用锁,再获取锁,效率稍高。
  3.  unlock() 释放锁。
  4.  newCondition() 获取监视器(可以指定某个现成进行wait操作或者notify操作)
  5.  isFair() 获取是否是公平锁。

synchronize关键字 和 lock接口的区别

类别synchronizedLock
存在层次Java的关键字,在jvm层面上是一个类
锁的释放1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁在finally中必须释放锁,不然容易造成线程死锁
锁的获取假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待分情况而定,Lock有多个锁获取的方式,具体下面会说道,大致就是可以尝试获得锁,线程可以不用一直等待
锁状态无法判断可以判断
锁类型可重入 不可中断 非公平可重入 可判断 可公平(两者皆可)
性能少量同步大量同步

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值