1分飞艇IOS下载_Java多线程,对锁机制的进一步分析

  • 时间:
  • 浏览:3
  • 来源:上海网_专注上海新闻_上海的主流媒体

1 可重入锁

    可重入锁,也叫递归锁。它有两层含义,第一,当几次 应用应用程序在外层函数得到可重入锁后,能直接递归地调用该函数,第二,同一应用应用程序在外层函数获得可重入锁后,内层函数时需直接获取该锁对应其它代码的控制权。可是 让让我门提到的synchronized和ReentrantLock都会可重入锁。

    通过ReEnterSyncDemo.java,让让我门来演示下synchronized关键字的可重入性。    

1	class SyncReEnter implements Runnable{
2	   public synchronized void get(){
3	     System.out.print(Thread.currentThread().getId() + "\t");
4	      //在get最好的辦法

里调用set
5	      set();
6	    }
7	    public synchronized void set()
8	    {System.out.print(Thread.currentThread().getId()+"\t"); }
9	    public void run() //run最好的辦法

里调用了get最好的辦法

10	    { get();}
11	}
12	public class ReEnterSyncDemo {
13	    public static void main(String[] args) {
14	       	SyncReEnter demo=new SyncReEnter();
15	        new Thread(demo).start();
16	        new Thread(demo).start();
17	    }
18	}

    在第1行里,让让我门是让syncReEnter类通过实现Runnable的最好的辦法 来实现多应用应用程序,在其中第2和第7行所定义的get和set最好的辦法 均饱含synchronized关键字。在第9行定义的run最好的辦法 里,让让我门调用了get最好的辦法 。在main函数的第15和16行里,让让我门启动了2次应用应用程序,这段代码的输出如下。

    8   8   9   9  

    在第15行第一次启动应用应用程序时,在run最好的辦法 里,会调用饱含synchronized关键字的get最好的辦法 ,这时一点应用应用程序会得到get最好的辦法 的锁,当执行到get里的set最好的辦法 时,不可能 set最好的辦法 也饱含synchronized关键字,所以我set是饱含在get里的,所以有这里我太满 再次申请set的锁,能继续执行,所以有通过输出,让让我门能看后get和set的打印励志的话 是连续输出的。同理让让我门能理解第16行第二次启动应用应用程序的输出。

    通过ReEnterLock.java,让让我门来演示下ReentrantLock的可重入性。      

1	import java.util.concurrent.locks.ReentrantLock;
2	class LockReEnter implements Runnable {
3		ReentrantLock lock = new ReentrantLock();
4		public void get() {
5		  lock.lock();
6	  	  System.out.print(Thread.currentThread().getId()+"\t");
7		  // 在get最好的辦法

里调用set
8		  set();
9		  lock.unlock();
10	   }
11	   public void set() {
12		lock.lock();
13		System.out.print(Thread.currentThread().getId() + "\t");
14		lock.unlock();
15	   }
16	   public void run() 
17	   { get(); }
18	}
19	public class ReEnterLock {
20		public static void main(String[] args) {
21			LockReEnter demo = new LockReEnter();
22			new Thread(demo).start();
23			new Thread(demo).start();
24		}
25	}

    在第2行创建的LockReEnter类里,让让我门同样饱含了get和set最好的辦法 ,并在get最好的辦法 里调用了set最好的辦法 ,只不过在get和set最好的辦法 里,让让我门都会用synchronized,所以我用第3行定义的ReentrantLock类型的lock对象来管理多应用应用程序的并发,在第16行的run最好的辦法 里,让让我门同样地调用了get最好的辦法 。

    在main函数里,让让我门同样地在第22和23行里启动了两次应用应用程序,这段代码的运行结果如下。

    8   8   9   9

    当在第22行里第一次启动LockReEnter类型的应用应用程序后,在调用get最好的辦法 时,能得到第5行的锁对象,get最好的辦法 会调用set最好的辦法 ,我觉得set最好的辦法 里的第12行会再次申请锁,但不可能 LockReEnter应用应用程序在get最好的辦法 里不可能 得到了锁,所以有在set最好的辦法 里我太满 得到锁,所以有第一次运行时,get和set最好的辦法 会一块儿执行,同样地,在第23行第二次其中应用应用程序时,也会一块儿打印get和set最好的辦法 里的输出。

    在项目的一点场景里,几次 应用应用程序有不可能 时需多次进入被锁关联的最好的辦法 ,比如某数据库的操作的应用应用程序时需多次调用被锁管理的“获取数据库连接”的最好的辦法 ,这时,不可能 使用可重入锁就能处理死锁的现象报告 ,相反,不可能 让让我门都会用可重入锁,越来越在第二次调用“获取数据库连接”最好的辦法 时,都会不可能 被锁住,从而原因分析分析死锁现象报告 。

2 公平锁和非公平锁

    在创建Semaphore对象时,让让我门时需通过第几次 参数,来指定该Semaphore对象算不算以公平锁的最好的辦法 来调度资源。

    公平锁会维护几次 等待的图片 队列,多个在阻塞情况表等待的图片 的应用应用程序会被插入到一点等待的图片 队列,在调度时是按它们所发请求的时间顺序获取锁,而对于非公平锁,当几次 应用应用程序请求非公平锁时,不可能 此时该锁变成可用情况表,越来越一点应用应用程序会跳过等待的图片 队列中所有的等待的图片 应用应用程序而获得锁。

    让让我门在创建可重入锁时,也时需通过调用带布尔类型参数的构造函数来指定该锁算不算公平锁。ReentrantLock(boolean fair)。

    在项目里,不可能 请求锁的平均时间间隔较长,建议使用公平锁,反之建议使用非公平锁。

    比如有个服务窗口,不可能 采用非公平锁的最好的辦法 ,当窗口空闲时,都会让下一号来,所以我假若来人就服务,所以我能缩短窗口的空闲等待的图片 时间,从而提升单位时间内的服务数量(也所以我吞吐量)。相反,不可能 这是个比较冷门的服务窗口,在所以有时间里来请求服务的频次好的反义词高,比如一小时才来几次 人,越来越就时需选泽 公平锁了。不可能 ,不可能 要缩短用户的平均等待的图片 时间,越来越时需选泽 公平锁,所以我就能处理“早到的请求晚处理“的情况表。

3 读写锁

    可是 让让我门通过synchronized和ReentrantLock来管理临界资源时,只所以我几次 应用应用程序得到锁,其它应用应用程序越来越操作一点临界资源,一点锁时需叫做“互斥锁”。

    和一点管理最好的辦法 相比,ReentrantReadWriteLock对象会使用两把锁来管理临界资源,几次 是“读锁“,所以我是“写锁“。

    不可能 几次 应用应用程序获得了某资源上的“读锁“,越来越其它对该资源执行“读操作“的应用应用程序还是时需继续获得该锁,也所以我说,“读操作“时需并发执行,但执行“写操作“的应用应用程序会被阻塞。不可能 几次 应用应用程序获得了某资源的“写锁“,越来越其它任何企图获得该资源“读锁“和“写锁“的应用应用程序都将被阻塞。

    和互斥锁相比,读写锁在保证并发时数据准确性的一块儿,允一点个应用应用程序一块儿“读“某资源,从而能提升下行速率 。通过下面的ReadWriteLockDemo.java,让让我门来观察下通过读写锁管理读写并发应用应用程序的最好的辦法 。    

1	import java.util.concurrent.locks.Lock;
2	import java.util.concurrent.locks.ReentrantReadWriteLock;
3	class ReadWriteTool {
4		private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
5		private Lock readLock = lock.readLock();
6		private Lock writeLock = lock.writeLock();
7		private int num = 0;
8	  	public void read() {//读的最好的辦法

 
9			int cnt = 0;
10			while (cnt++ < 3) {
11				try {
12					readLock.lock();				System.out.println(Thread.currentThread().getId()
13							+ " start to read");
14					Thread.sleep(4000);		
15		System.out.println(Thread.currentThread().getId() + " reading,"	+ num);
16				} catch (Exception e) 
17	            { e.printStackTrace();}
18	            finally { readLock.unlock(); 	}
19			}
20		}
21		public void write() {//写的最好的辦法

22			int cnt = 0;
23			while (cnt++ < 3) {
24				try {
25					writeLock.lock();		
26			System.out.println(Thread.currentThread().getId()
27							+ " start to write");
28					Thread.sleep(4000);
29					num = (int) (Math.random() * 10);
400				System.out.println(Thread.currentThread().getId() + " write," + num);
31				} catch (Exception e) 
32	            { e.printStackTrace();} 
33	            finally { writeLock.unlock();}
34			}
35		}
36	}

    在第3行定义的ReadWriteTool 类里,让让我门在第4行创建了几次 读写锁,并在第5和第6行,分别通过一点读写锁的readLock和writeLock最好的辦法 ,分别创建了读锁和写锁。

    在第8行的read最好的辦法 里,让让我门是先通过第12行的代码加“读锁“,可是 在第15行进行读操作。在第21行的write最好的辦法 里,让让我门是先通过第25行的代码加“写锁”,可是 在第400行进行写操作。    

37	class ReadThread extends Thread {
38		private ReadWriteTool readTool;
39		public ReadThread(ReadWriteTool readTool) 
40	    { this.readTool = readTool;	}
41		public void run() 
42	    { readTool.read();}
43	}
44	class WriteThread extends Thread {
45		private ReadWriteTool writeTool;
46		public WriteThread(ReadWriteTool writeTool) 
47	    { this.writeTool = writeTool; }
48		public void run() 
49	    { writeTool.write();	}
400	}

    在第37行和第44行里,让让我门分别定义了读和写一点个 应用应用程序,在ReadThread应用应用程序的run最好的辦法 里,让让我门调用了ReadWriteTool类的read最好的辦法 ,而在WriteThread应用应用程序的run最好的辦法 里,则调用了write最好的辦法 。    

51	public class ReadWriteLockDemo {
52		public static void main(String[] args) {
53			ReadWriteTool tool = new ReadWriteTool();
54			for (int i = 0; i < 3; i++) {
55				new ReadThread(tool).start();
56				new WriteThread(tool).start();
57			}
58		}
59	}

    在main函数的第53行,让让我门创建了几次 ReadWriteTool类型的tool对象,在第55和56行初始化读写应用应用程序时,让让我门传入了该tool对象,也所以我说,通过54行for循环创建并启动的多个读写应用应用程序是通过同几次 读写锁来控制读写并发操作的。

    出于多应用应用程序并发调度的原因分析分析,让让我门每次运行都会可能 得到不同的结果,但从那此不同的结果里,让让我门都態明显地看出读写锁协调管理读写应用应用程序的最好的辦法 ,比如来看下如下的次要输出结果。    

1	8 start to read
2	10 start to read
3	12 start to read
4	8 reading,0
5	10 reading,0
6	12 reading,0
7	9 start to write
8	9 write,2
9	11 start to write
10	11 write,6

    这里让让我门是通过ReadWriteTool类里的读写锁管理其中的num值,从第1到第6行的输出中让让我门能看后,我觉得8号应用应用程序不可能 得到读锁始于英文读num资源时,10号和12号读应用应用程序依然时需得到读锁,从而能并发地读取num资源。但在读操作期间,是不允许有写操作的应用应用程序进入,也所以我说,当num资源上有读锁期间,其它应用应用程序是无法得到该资源上的“写锁”的。

    从第7到第10行的输出中让让我门能看后,当9号应用应用程序得到num资源上的“写锁”时,其它应用应用程序是无法得到该资源上的“读锁“和“写锁“的,而11号应用应用程序一定得当9号应用应用程序释放了“写锁”后,我太满 得到num资源的“写锁”。

    不可能 在项目里对一点资源(比如文件)有读写操作,这时让让我门不妨时需使用读写锁,不可能 读操作的数量要远超过写操作时,越来越更时需用读写锁来让读操作时需并发执行,从而提升性能。

猜你喜欢

2分彩手机app下载_跳槽时,不敢要高工资也会对候选人不利

  我在做技术面试官的前一天 ,在问完大大问题后,照例会问一句:你期望的工资是几次?对此,我只会记录下候选人的回答就让 上报,那末 同意权,更那末 批驳权。  判断候选

2020-06-02

极速时时彩官方_艾媒咨询发布输入法行业报告:百度输入法使用体验最佳、语音最强

当春节倒计时开启,刷起回家的车票,你手机里的家人群、同学群、你们群是前要也接二连三的活跃起来?但一想到要大冬天里抱着手机敲出极速时时彩官方多量文字,不禁心生退意,缩回暴露在冷空

2020-06-02

大发uu快3神彩_特色佳肴简单做:皮蛋豆腐

谁说做饭烹调美食过程繁多复杂性?今天《生活法律法律依据网》小编大发uu快3神彩就来教你怎样才能以简单步骤烹煮出色的佳肴。“皮蛋豆腐”喜欢吃吧?今天就来学做它!材料:皮蛋1/一另

2020-06-02

秒秒pk10口诀 _2019Q1 K12在线教育报告:市场规模环比增6.7%

K秒秒pk10口诀 12教育阶段覆盖时间长,且饱含了小升初、初升高等重要阶段,成为目前我国最大的细分教育市场。随着互联网的层厚发展渗透,K12在线教育渗透率不断上升,并将从一二

2020-06-02

2分快3教程_秋季多肉植物的养护方法

秋天了,天气渐凉,多肉植物该怎么养殖呢?下面生活妙招 网小编就来教这些 人,不类似于型的多肉植物在秋季的养护妙招 。快来看看吧!一、春秋型多肉1、代表种类景天科的天锦

2020-06-02