1.JUC锁的一些概念

Posted 白日梦想家12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.JUC锁的一些概念相关的知识,希望对你有一定的参考价值。

原文链接:http://blog.csdn.net/zteny/article/details/54859228

接下来的几篇文章都转自这里,冒犯之处,多多包涵

 

原子性:

在看原子性之前,我们先看看什么是原子。 
1. 原子,记得在化学中提到原子是这么定义的

原子是元素能保持其化学性质的最小单位。 来自 wikipedia

因此我们认为原子是世界上最小的物质单位,具体有不可分割性。 

2. 原子操作:是一个不再分的操作。 

如,a=0 是一个子原操作。但a++, 不是原子操作,因为它是可以分解成 int t = a + 1; a =t; 两个操作。 

3. 原子性 

由此便可引出原子性了,即是 一个操作属于原子操作的话,那么我们称它具有原子性

 

原语:

  通常把不可断的过程称之为原语

是由若干条指令组成的,用于完成一定功能的一个过程。 
primitive or atomic action 是由若干个机器指令构成的完成某种特定功能的一段程序,具有不可分割性。即原语的执行必须是连续的,在执行过程中不允许被中断。——百度百科

 

可见性:

  可见性,是指线程之家的可见性,一个线程修改的状态是对另一个线程是可见的。

  内存可见性:内存是线程共享的,线程A操作变量后,直接更新内存,线程B立马可以看到线程A操作的效果;后面讲到 volatile 时,在详细介绍

 

临界区:

我们把并发进程中与共享变量有关的程序段称为临界区。 —— 来自操作系统

 

可重入:

  可重入,顾名思义,就是可以递归、循环进入

  如果当前线程已经获得了某个监听器对象所持有的锁,那么该线程在该方法中调用另外一个同步方法也同样持有该锁。比如:

public synchronized void test() {
    xxxxxx;
    test2();
}
 
public synchronized void test2() {
    yyyyy;
}

   在上面代码段中,执行 test 方法需要获得当前对象作为监视器的对象锁,但方法中又调用了 test2 的同步方法

  如果锁是具有可重入性的话,那么该线程在调用 test2 时并不需要再次获得当前对象的锁,可以直接进入 test2 方法进行操作

  如果锁是不具有可重入性的话,那么该线程在调用 test2 前会等待当前对象锁的释放,实际上该对象锁已被当前线程所持有,不可能再次获得

  如果锁是不具有可重入性特点的话,那么线程在调用同步方法、含有锁的方法时就会产生死锁。

 

 

公平性:

  公平性是出现在锁存在竞争的情况下,假若:在竞争锁的时候大家一起来排队,先到先得,我们认为这种策略是公平的;如果不是严格按照这个次序获取锁的情况,我们就称它是不公平的。即新来的人反倒有更大的机会拿到锁,这就是不公平的。

  在实现上,新来的人,先做一次检查,如果当时有锁资源,就会先给新人。否则进入队列跟大家一起排队。

  

排它锁:

  排它锁,也叫独占锁,顾名思义即是 只能有一个线程同时获取这个锁。也叫X锁

 

共享锁:

  共享锁,也叫读锁,允许多个线程持有这个锁。称S锁

 

自旋锁:是一个不可重入性锁

 

可重入锁:

  可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁后,内层递归函数仍然有该锁资源

以上是关于1.JUC锁的一些概念的主要内容,如果未能解决你的问题,请参考以下文章

为啥基于锁的程序不能组成正确的线程安全片段?

详解 synchronize 锁的升级

锁的相关概念介绍

各种锁的概念

LockSupport.java 中的 FIFO 互斥代码片段

多线程JUC 篇 1.1juc的基本知识