5分彩app开户_Java多线程,对锁机制的进一步分析

  • 时间:
  • 浏览:1
  • 来源:蚂蚁资源网_提供小邝娱乐网技术_QQ粉丝网资讯

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)。

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

    比如有个服务窗口,之后采用非公平锁的法律法律依据,当窗口空闲时,有的是让下一号来,之后若果来人就服务,一个 能缩短窗口的空闲等待歌曲时间,从而提升单位时间内的服务数量(有的是之后吞吐量)。相反,之后这是个比较冷门的服务窗口,在必须 来很多时间里来请求服务的频次必须 多高,比如一小时才来1当时人,必须 就可不前要选择公平锁了。之后,之后要缩短用户的平均等待歌曲时间,必须 可不前要选择公平锁,一个 就能避免“早到的请求晚避免“的清况 。

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(30);		
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(30);
29					num = (int) (Math.random() * 10);
30				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行的代码加“写锁”,之后在第30行进行写操作。    

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();	}
30	}

    在第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资源的“写锁”。

    之后在项目里对某些资源(比如文件)有读写操作,这时朋友不妨可不前要使用读写锁,之后读操作的数量要远超过写操作时,必须 更可不前要用读写锁来让读操作可不前要并发执行,从而提升性能。

猜你喜欢

10分彩app安卓_2018年木马病毒包新增超800万个,腾讯手机管家提醒用户警惕潜在威胁

2010分彩app安卓18年10分彩app安卓,信息泄露事件、电信网络诈骗事件频发,移动端安10分彩app安卓全形势依旧严峻。1月,广州一位女博士遭遇“假冒公检法”诈骗,损失8

2020-06-02

3分快3导航网_秋季多肉植物的养护方法

秋天了3分快3导航网,天气渐凉,多肉植物该何如养殖呢?下面生活3分快3导航网土依据 网小编就来教其他同学 ,不同类型的多肉植物在秋季的养护土依据 。快来看看吧!一、春

2020-06-02

极速pk10网页版_ 宵夜和夜宵有什么区别?

民以食为天,中国饮食极速pk10网页版的文化发展历史悠久,无论好久都少不了吃,一日三餐也刚开始变成了一日多餐,你你这俩 但是,”夜宵”你你这俩 极速pk10网页版词就时不时

2020-06-02

极速快3走势_戴森设计大奖国际20强揭晓,中国作品冲刺冠军

从膀胱疾病康复导尿管,到单一材料纸尿裤,或是用鱼制成的塑料替代品入围2019年戴森设计大奖国际20强的作品将彻底改变产品设计的可持续性和社会影响在社会可持续发展的浪潮中,兼顾设

2020-06-02

幸运快3平台代理_信女儿谈被生母抛弃 小丸子生母是谁?

《一路成年》中歌手信与女儿小丸子的互动是最特殊的一对,可能性小丸子是在单亲家庭长大,信又工作很繁忙,很多很多抚养小丸子的任务交给了父母,小丸子与爷爷奶奶的感情比信好,在相处中小

2020-06-02