Lock与synchronized对比

Lock接口方法功能
lock.lock获取锁 阻塞
lock.tryLock获取锁 成功返回true 失败false
lock.tryLock(1, TimeUnit.SECONDS)等待制定时间 获取锁 成功返回true 失败false
lock.lockInterruptibly注意,如果需要正确中断等待锁的线程,必须将获取锁放在外面,然后将InterruptedException抛出 调用Thread.interrupt方法打断
lock.unlock释放锁
设置公平锁Lock lock = new ReentrantLock(true);//true为公平锁

synchronized 与 Lock接口功能区别

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

Demo简单示例


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

/**
 * 
 * @author gyn 实现一个线程安全的计数器
 */
public class Test100 implements Runnable {
	public final static ExecutorService EXECUTOR = Executors.newFixedThreadPool(100);
	public static volatile int li = 0;
	public static volatile int si = 0;
	public final static Lock lock = new ReentrantLock(true);//公平锁
	/**
	 * Lock实现
	 */
	public static void getLockInt() {
		lock.lock();// 获取锁
		try {
			li++;
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			lock.unlock();// 释放锁
		}

	}
	/**
	 * synchronized关键字实现
	 */
	public static synchronized void getSynInt() {
		si++;

	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 100; i++) {
			getSynInt();
		}
		for (int i = 0; i < 100; i++) {
			getLockInt();
		}

	}

	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < 100; i++) {
			EXECUTOR.execute(new Test100());
		}
		EXECUTOR.shutdown();
		for (;;) {
			// 判断线程池任务是否执行完毕
			if (EXECUTOR.isTerminated()) {

				System.out.println("Lock实现			li=" + Test100.li);
				System.out.println("synchronized关键字实现	si=" + Test100.si);
				break;
			} else {
				System.out.println("线程未结束");

				Thread.sleep(200);
			}

		}
	}
}

控制台输出-----------------都是线程安全的

线程未结束
Lock实现			li=10000
synchronized关键字实现	si=10000
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值