浅谈多线程中的锁的几种用法总结(必看)

网友投稿 200 2023-05-13


浅谈多线程中的锁的几种用法总结(必看)

一、ReentrantLock

package com.ietree.basicskill.mutilthread.lock;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* Created by Administrator on 2017/5/17.

*/

public class UseReentrantLock {

private Lock lock = new ReentrantLock();

public void method1(){

try {

lock.lock();

System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method1..");

Thread.sleep(1000);

System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method1..");

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void method2(){

try {

lock.lock();

System.out.println("当前线程:" + Thread.currentThread().getName() + "进入method2..");

Thread.sleep(2000);

System.out.println("当前线程:" + Thread.currentThread().getName() + "退出method2..");

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public static void main(String[] args) {

final UseReentrantLock ur = new UseReentrantLock();

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

ur.method1();

ur.method2();

}

}, "t1");

t1.start();

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

//System.out.println(ur.lock.getQueueLength());

}

}

二、ReentrantReadWriteLock

package com.ietree.basicskill.mutilthread.lock;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**

* Created by Administrator on 2017/5/17.

*/

public class UseReentrantReadWriteLock {

private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();

private ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();

private ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();

public void read(){

try {

readLock.lock();

System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");

Thread.sleep(3000);

System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");

} catch (Exception e) {

e.printStackTrace();

} finally {

readLock.unlock();

}

}

public void write(){

try {

writeLock.lock();

System.out.println("当前线程:" + Thread.currentThread().getName() + "进入...");

Thread.sleep(3000);

System.out.println("当前线程:" + Thread.currentThread().getName() + "退出...");

} catch (Exception e) {

e.printStackTrace();

} finally {

writeLock.unlock();

}

}

public static void main(String[] args) {

final UseReentrantReadWriteLock urrw = new UseReentrantReadWriteLock();

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

urrw.read();

}

}, "t1");

Thread t2 = new Thread(new Runnable() {

@Override

public void run() {

urrw.read();

}

}, "t2");

Thread t3 = new Thread(new Runnable() {

@Override

public void run() {

urrw.write();

}

}, "t3");

Thread t4 = new Thread(new Runnable() {

@Override

public void run() {

urrw.write();

}

}, "t4");

// t1.start();

// t2.start();

// t1.start(); // R

// t3.start(); // W

t3.start();

t4.start();

}

}

三、Condition

package com.ietree.basicskill.mutilthread.lock;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* Created by Administrator on 2017/5/17.

*/

public class UseCondition {

private Lock lock = new ReentrantLock();

private Condition condition = lock.newCondition();

public void method1(){

try {

lock.lock();

System.out.println("当前线程:" + Thread.currentThread().getName() + "进入等待状态..");

Thread.sleep(3000);

System.out.println("当前线程:" + Thread.currentThread().getName() + "释放锁..");

condition.await(); // Object wait

System.out.println("当前线程:" + Thread.currentThread().getName() +"继续执行...");

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void method2(){

try {

lock.lock();

System.out.println("当前线程:" + Thread.currentThread().getName() + "进入..");

Thread.sleep(3000);

System.out.println("当前线程:" + Thread.currentThread().getName() + "发出唤醒..");

condition.signal(); //Object notify

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public static void main(String[] args) {

final UseCondition uc = new UseCondition();

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

uc.method1();

}

}, "t1");

Thread t2 = new Thread(new Runnable() {

@Override

public void run() {

uc.method2();

}

}, "t2");

t1.start();

t2.start();

}

}

四、ManyCondition

package com.ietree.basicskill.mutilthread.lock;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.ReentrantLock;

/**

* Created by Administrator on 2017/5/17.

*/

public class UseManyCondition {

private ReentrantLock lock = new ReentrantLock();

private Condition c1 = lock.newCondition();

private Condition c2 = lock.newCondition();

public void m1(){

try {

lock.lock();

System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m1等待..");

c1.await();

System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m1继续..");

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void m2(){

try {

lock.lock();

System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m2等待..");

c1.await();

System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m2继续..");

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void m3(){

try {

lock.lock();

System.out.println("当前线程:" +Thread.currentThread().getName() + "进入方法m3等待..");

c2.await();

System.out.println("当前线程:" +Thread.currentThread().getName() + "方法m3继续..");

} catch (Exhttp://ception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void m4(){

try {

lock.lock();

System.out.println("当前线程:" +Thread.currentThread().getName() + "唤醒..");

c1.signalAll();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void m5(){

try {

lock.lock();

System.out.println("当前线程:" +Thread.currentThread().getName() + "唤醒..");

c2.signal();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public static void main(String[] args) {

final UseManyCondition umc = new UseManyCondition();

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

umc.m1();

}

},"t1");

Thread t2 = new Thread(new Runnable() {

@Override

public void run() {

umc.m2();

}

},"t2");

Thread t3 = new Thread(new Runnable() {

@Override

public void run() {

umc.m3();

}

},"t3");

Thread t4 = new Thread(new Runnable() {

@Override

public void run() {

umc.m4();

}

},"t4");

Thread t5 = new Thread(new Runnable() {

@Override

public void run() {

umc.m5();

}

},"t5");

t1.start(); // c1

t2.start(); // c1

t3.start(); // c2

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

t4.start(); // c1

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

t5.start(); // c2

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java并发之ArrayBlockingQueue详细介绍
下一篇:全面解析SpringBoot自动配置的实现原理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~