欢迎来到天天文库
浏览记录
ID:30775984
大小:100.50 KB
页数:9页
时间:2019-01-03
《java并发编程实战(2):synchronized-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java并发编程实战(2):synchronized-编程开发技术Java并发编程实战(2):synchronized原文出处:chenssy在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者、写相同的数据,访问相同的文件等等。对于这种情况如果我们不加以控制,是非常容易导致错误的。在java中,为了解决这个问题,引入临界区概念。所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问。在java中为了实现临界区提供了同步机制。当一个线程试图访问一个临界区吋,他将使用一种同步机制來查
2、看是不是已经有其他线程进入临界区。如果没有则他就可以进入临界区,否则他就会被同步机制挂起,指定进入的线程离开这个临界区。临界区规定:毎次只准许一个进程进入临界区,进入后不允许其他进程进入。调度法则为(百度百科):1、如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。2、任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。3、进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。4、如果进程不能进入自己的临界区,则应让出CPU,避免进
3、程出现“忙等”现象。下面介绍使用synchronized关键字来实现同步机制。一、synchronized关键字1・1、简介synchronized,我们谓之锁,主要用来给方法、代码块加锁。当某个方法或者代码块使用synchronized时,那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。但是,其余线程是可以访问该对彖111的非加锁代码块的。synchronized主要包括两种方法:sync
4、hronized方法、synchronized块。1.2>synchronized方法通过在方法声明中加入synchronized关键字來声明synchronized方法。如:publicsynchronizedvoidgetResult();synchronized方法控制对类成员变量的访问。它是如何來避免类成员变量的访问控制呢?我们知道方法使用了synchronized关键字表明该方法已加锁,在任一线程在访问改方法时都必须要判断该方法是否冇其他线程在“独占”。每个类实例对应一个把锁,毎个synchronized方
5、法都必须调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回吋才将锁释放,被阻塞的线程方能获得该锁。其实synchronized方法是存在缺陷的,如果我们将一个很大的方法声明为synchronized将会大大影响效率的。如果多个线程在访问一个synchronized方法,那么同一时刻只有一个线程在执行该方法,而其他线程都必须等待,但是如果该方法没有使用synchronized,则所有线程可以在同一时刻执行它,减少了执行的总时间。所以如果我们知道一个方法不会被多个线程执行到或者说
6、不存在资源共享的问题,则不需要使用synchronized关键字。但是如果一定要使用synchronized关键字,那么我们可以synchronized代码块来替换synchronized方法。1.3、synchronized块synchronized代码块所起到的作用和synchronized方法一样,只不过它使临界区变的尽可能短了,换句话说:它只把需要的共享数据保护起来,其余的长代码块留出此操作。语法如下:synchronized(object){//允许访问控制的代码如果我们需要以这种方式来使用synchron
7、ized关键字,那么必须要通过一个对彖引用来作为参数,通常这个参数我们常使用为this.synchronized(this){//允许访问控制的代码对于synchronized(this)有如下理解:1、当两个并发线程访问同一个对象object屮的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。2、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问obje
8、ct小的非synchronized(this)同步代码块。3、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其他synchronized(this)同步代码块得访问将被阻塞。4、第三个例子同样适用其他同步代码块。也就是说,当一个线程访问object的一个synchro
此文档下载收益归作者所有