关于java的锁

 

package com.lhy;

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

public class A {
	static A a=new A();
	public static void main(String[] args) {
		new Thread(){
            public void run() {
                a.add();
            };
        }.start();
        
       
        
        new Thread(){
            public void run() {
                a.add1();
            };
        }.start();
        
        new Thread(){
            public void run() {
                a.add2();
            };
        }.start();
        
        new Thread(){
            public void run() {
                a.add3();
            };
        }.start();
        
        
        new Thread(){
            public void run() {
                a.add4();
            };
        }.start();
        
        new Thread(){
            public void run() {
                a.add5();
            };
        }.start();
	}
	Lock lock = new ReentrantLock();    //注意这个地方,类变量不能定义在方法中
    
	/**
	 * 普通锁块
	 */
	void add(){
		int i=0;
		synchronized(this){
		while(true){
			if(i==5)
				break;
			i++;
			System.out.println("****synchronize块锁:"+i);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		}
	}
	/**
	 * 普通方法锁
	 */
	 synchronized void add1(){
		int i=0;
		while(true){
			if(i==5)
				break;
			
			i++;
			System.out.println("****synchronized方法锁:"+i);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	 	/**
		 * 普通lock锁
		 */
	  void add2(){
			int i=0;
			lock.lock();
			while(true){
				if(i==5)
					break;
				
				i++;
				System.out.println("####ReentrantLock锁:"+i);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			lock.unlock();
		}
	  /**
		 * 普通lock锁
		 */
	  void add3(){
			int i=0;
			lock.lock();
			while(true){
				if(i==5)
					break;
				
				i++;
				System.out.println("####ReentrantLock锁:"+i);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			lock.unlock();
		}
	  
	  ReentrantReadWriteLock  wrlock1=new ReentrantReadWriteLock();
	  /**
		 * 读锁
		 */
	  void add4(){
			int i=0;
			wrlock1.readLock().lock();
			while(true){
				if(i==5)
					break;
				
				i++;
				System.out.println("*****ReentrantReadWriteLock的read锁:"+i);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			wrlock1.readLock().unlock();
		}
	  /**
		 * 写锁
		 */
	  
	  void add5(){
			int i=0;
			wrlock1.writeLock().lock();
			while(true){
				if(i==5)
					break;
				
				i++;
				System.out.println("ReentrantReadWriteLock的write锁:"+i);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			wrlock1.writeLock().unlock();
		}
}

输出结果

****synchronize块锁:1
####ReentrantLock锁:1
*****ReentrantReadWriteLock的read锁:1
****synchronize块锁:2
####ReentrantLock锁:2
*****ReentrantReadWriteLock的read锁:2
****synchronize块锁:3
####ReentrantLock锁:3
*****ReentrantReadWriteLock的read锁:3
****synchronize块锁:4
####ReentrantLock锁:4
*****ReentrantReadWriteLock的read锁:4
****synchronize块锁:5
####ReentrantLock锁:5
*****ReentrantReadWriteLock的read锁:5
****synchronized方法锁:1
####ReentrantLock锁:1
ReentrantReadWriteLock的write锁:1
****synchronized方法锁:2
####ReentrantLock锁:2
ReentrantReadWriteLock的write锁:2
****synchronized方法锁:3
####ReentrantLock锁:3
ReentrantReadWriteLock的write锁:3
****synchronized方法锁:4
####ReentrantLock锁:4
ReentrantReadWriteLock的write锁:4
****synchronized方法锁:5
####ReentrantLock锁:5
ReentrantReadWriteLock的write锁:5

 

总结:

(1)synchronized :对于多个线程同时访问synchronized 修饰的,不管是方法还是代码块,只要一个线程进入其中一个synchronized修饰的方法或块,其他线程就不能进入此类下任何synchronized修饰的方法或块。

(2)ReentrantLock:对于多个线程同时访问ReentrantLock修饰代码块,只要一个线程获得ReentrantLock的lock(),在此线程unlock()前,其他线程就不能进入此类下任何ReentrantLock.lock()。

(3)ReentrantReadWriteLock:对于read锁,多个线程可以同时访问read锁,但如果其中一个线程获得write锁,其他线程都不能进入此类下的任何write.lock()或者read.lock()

    即:多个读锁不互斥。读写,写写互斥(互斥效果同1,2)

以上三种锁机制不互斥

以上所有都是多个线程针对同一个类中的锁。

 

基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

life1024

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值