Java内容的复习-线程同步

        Unsafe有点类似于反射, 但Unsafe速度快于反射,通过Unsafe可以拿到某个成员变量相对于类的偏移量,然后再按照偏移量拿到某个对象的这个成员变量的值 。很多锁的同步底层都是用Unsafe做的。如Unsafe的CAS

http://frankfan915.iteye.com/admin/blogs/1153726

        ReentrantLock

ReentrantLock的特点是

1.它可以被重入,获得锁的线程可以反复获得锁,锁的次数会增加,释放的时候也需要释放相应的次数才能完全释放当前锁(Syncronized也是可以重入的)

2. Lock和unlock可以不在同一个代码块中,unlock一般在final块中

3. ReentrantLock是用CAS机制保证同步的,速度快于Syncronized

4. ReentrantLock分为公平锁和非公平锁,公平锁是先申请锁,先获得锁

5. ReentrantLock可以调用acquireInterruptibly方法获取锁,当线程中断的时候,抛出一个异常,可以防止死锁

6. ReentrantLock支持多个condition,可以很好的解决put和get多条件等待的问题

         http://frankfan915.iteye.com/admin/blogs/1182026

         http://frankfan915.iteye.com/admin/blogs/2099821

         

        synchronized的底层实现主要依靠Lock-Free的队列,基本思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。

         http://blog.csdn.net/chen77716/article/details/6618779

        Volatile 

         Volatile的优点是

         1.代码比较简单,只要在变量前加Volatile

         2.可扩展性好

         3.性能好,不需要锁住代码块

         4.Volatile保证了变量的可见性,但不能保证变量的原子性(如i++不是线程安全的)

         

         缺点:

         容易出错,比较难设计

         

         原理是加了Volatile的变量的更新都是直接更新到主内存的。多个线程共享一个主内存,但是每个线程都有自己的工作线程。对于没有Volatile的变量,线程都是拷贝主线程到工作内存,然后进行操作,被修改的值可能会在工作内存保存一段时间,不能及时的更新到主内存。Volatile一般都是和CAS一起使用,保证对数据操作的原子性。详见ReentrantLock

         http://frankfan915.iteye.com/admin/blogs/1222627

         

          Interrupt和stop的区别:

如果该线程处在可中断状态下,(调用了xx.wait(),或者Selector.select(),Thread.sleep()等特定会发生阻塞的 api),那么该线程会立即被唤醒,同时会受到一个InterruptedException,同时,如果是阻塞在io上,对应的资源会被关闭。如果该线 程接下来不执行“Thread.interrupted()方法(不是interrupt),那么该线程处理任何io资源的时候,都会导致这些资源关闭。interrupt不会导致线程直接退出,还是会在继续执行run函数。

Stop会让线程直接退出。

          线程封闭,是指变量只能被一个线程使用从而达到线程安全。三种情况:1.每个对象只被一个线程用时就是Confinement的 2.方法内的成员变量 3.ThreadLocal获得的变量

http://frankfan915.iteye.com/admin/blogs/1223081

           Sleep和wait的区别: 
sleep来自 thread类,wait来自 object类 

sleep不释放锁,还有线程控制权。wait释放锁,交出线程控制权,需要notify 

sleep必须捕捉异常,wait不必 

           Thread Join方法是需要先获得线程对象的锁,然后调用wait方法

http://frankfan915.iteye.com/admin/blogs/1222319

         lock和condition的使用

http://frankfan915.iteye.com/admin/blogs/2099821

         LinkedBlockingQueue

http://frankfan915.iteye.com/admin/blogs/2099831

         ConcurrentLinkedQueue

http://frankfan915.iteye.com/admin/blogs/2099850

 

     ConcurrentHashMap使用了多个Segment来存储数据,每个Segment相当于一个hashTable,不同Segment之间的读写删操作都是无关的。同一个Segment的写和删是需要加锁的,读是不用加锁的。增加的锁都是放在队列的头,删是通过拷贝被删节点前的所有节点来实现的

http://www.iteye.com/topic/344876

 

CountDownLatch 它的Sync函数和ReentrantLock不同,如果state值为0的时候,返回1,表示当前线程可以重新被调度。其他函数调用tryReleaseShared降低state,当state==0时unpark等待的线程。

 private static final class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = 4982264981922014374L;
        protected int tryAcquireShared(int acquires) {
            return (getState() == 0) ? 1 : -1;
        }

        protected boolean tryReleaseShared(int releases) {
            // Decrement count; signal when transition to zero
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }
    }

 

 

 

猜你喜欢

转载自frankfan915.iteye.com/blog/2099774