JAVA并发编程之基本概念

版权声明:本文为博主原创文章,转载请注明作者与出处,http://blog.csdn.net/lixingtao0520 https://blog.csdn.net/lixingtao0520/article/details/83869886

1、锁是对对象访问的时候,通过对对象加锁,防止并行访问的控制手段;对对象加锁成功,代表我持有这个对象的监视器,解锁,代表释放了这个对象的监视器。

拿到对象的监视器,肯定是对对象加锁成功的;对对象加锁成功 ,程序可以主动Watiing或者Time_waiting在对象监视器上。

2、锁与监视器区别

参见以下两篇文章 Java锁和监视器  java-jvm-jstack-(监视器和锁的概念)

3、同步队列与等待队列

简单的理解是同步队列存放着竞争同步资源的线程的引用(不是存放线程),而等待队列存放着待唤醒的线程的引用。

在Object的监视器模型中,一个对象拥有一个同步队列和一个等待队列,而并发包中的Lock(更确切的说是同步器AQS)拥有一个同步队列和多个等待队列。

4、非公平锁和公平锁

公平锁模式,是根据FIFO规则,在同步队列中,依据线程等待锁的时间长短,也就是头结点的下一个节点获取到锁。

非公平锁模式,一个线程在释放锁之后,ReentrantLock类从同步队列中怎么决定哪个线程可以获取到锁的?非公平锁的非公平体性体现在一个线程会首先尝试获取同步状态,不管同步队列是否有线程在排队,这就有可能在其他线程释放锁后,当前线程比同步队列中的线程先获取到锁。

以Semaphore类说明:
1、//非公平锁,在获取同步状态时,直接尝试获取同步状态,如果获取同步状态成功,则获取到锁。注意,非公平锁的线程并没有判断当前同步队列是否有节点。
final int nonfairTryAcquireShared(int acquires) {
            for (;;) {
                int available = getState();
                int remaining = available - acquires;
                if (remaining < 0 ||
                    compareAndSetState(available, remaining))
                    return remaining;
            }
        }
2、//公平锁,在获取同步状态时,先判断当前同步队列是否有节点,如果有存在等待的节点,则返回-1,表示获取锁失败
protected int tryAcquireShared(int acquires) {
            for (;;) {
                if (hasQueuedPredecessors())//查询是否有线程正在等待获取锁。
                    return -1;
                int available = getState();
                int remaining = available - acquires;
                if (remaining < 0 ||
                    compareAndSetState(available, remaining))
                    return remaining;
            }
        }

5、happen-before规则

待补充。。。

猜你喜欢

转载自blog.csdn.net/lixingtao0520/article/details/83869886