Lock锁

本文深入解析Java中的Lock锁机制,包括Lock接口及其两种主要实现ReentrantLock和ReentrantReadWriteLock的功能与应用场景。通过示例代码展示如何使用Lock进行线程同步,并探讨Lock与synchronized关键字之间的区别。
摘要由CSDN通过智能技术生成

一:Lock锁的含义

●Lock也是Java中锁的一大家族。同synchronized一样,保证操作的原子性。
●Lock是一个接口,两个直接实现类:ReentrantLock(重入锁),ReentrantReadWriteLock(读写锁)。

●Lock锁,使用时手动获取锁和释放锁,比synchronized更加灵活;可中断的获取锁;超时获取锁。
●ReentrantLock的底层是AQS队列[Abstract Queued Synchronizer队列同步器],AQS队列的底层是一种先入先出队列。具有可冲入,
    公平/非公平锁的特点,其底层具有一种工作窃取算法用来提高工作效率。 

非公平锁会抢占锁资源,执行效率会更高。

工作窃取:当一个线程是空闲时,它会监听哪一个线程是繁忙的,主动去帮助繁忙的线程。

   
●可重入:属于锁的一种特性。线程在完成任务后,会判断是否能够拿到下一次使用资源的机会。如果可以,就继续占用锁(锁的变量自增),不放弃对当前锁的占用。当锁的变量为0时,B和C就可以使用锁了。
●公平/非公平锁:核心的区别就是抢占。

ReentrantLock和Synchronized的区别:可以实例化对象;含有更多丰富的方法;

二:Lock锁案例

package com.zc;

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

import com.sun.org.apache.bcel.internal.generic.NEW;

public class Test09 implements Runnable{

	Lock lock1=new ReentrantLock();
	private int ticketNum=100;
	
	@Override
	public void run(){
		lock1.lock();
		long l1=System.currentTimeMillis();
		for(int i = 0; i < 20; i++) {
			System.out.println(Thread.currentThread().getName()+" : "+i);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
		lock1.unlock();
	}
	
	public static void main(String[] args) {
		
		Test09 t1=new Test09();
		new Thread(t1,"张丹").start();
		new Thread(t1,"李思").start();
		new Thread(t1,"王吴").start();
	}

}

lock():获得锁

trylock():只有在调用时它不被另一个线程占用才能获取锁。

unlock():线程无响应时,尝试释放此锁。

三:某个Java技术实现线程安全的原理是什么?

》悲观锁ReentrantLock和Synchronized.才能保证原子性操作,创建互斥区。

》还有一些可以向线程安全方向优化的技术。比方说,乐观锁的思想,CAS理论,volatile.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值