`

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;
            }
        }
    }

 

 

 

分享到:
评论

相关推荐

    Java期末复习||应用程序设计-多线程和泛型

    Java应用程序设计之多线程和泛型 Thread、Runnable、Callable 线程操作:isAlive()、isInterrupted()、join()、sleep()、stop()、interrupted()、setDaemon()、setPriority()、yield() 同步与死锁、Object类对线程的...

    AIC的Java课程1-6章

     理解和应用Java异常,常用类,IO,集合和多线程等开发技术。  课时安排  总学时:52学时  授课:48学时 (含约20学时实验)  考试:4学时  预备知识  了解和使用操作系统,...

    java进阶13天资料.zip

    day07-异常,线程的创建方式,,线程安全,线程同步 day08-线程状态,volatile关键字、原子性、并发包、死锁、线程池 day09-方法引用, Stream流,File类 , 递归 ,字节流 day10-字符流, 缓冲流、转换流、序列化流,...

    43道Java多线程高频题整理(附答案背诵版).md

    1. **全面覆盖**:资源涵盖了Java多线程编程中的核心知识点,包括线程的创建与管理、线程同步、线程通信、并发工具类等。 2. **答案详尽**:每道题目提供了详尽的答案解析,帮助学习者理解每个多线程问题的解决思路...

    java复习文档

    java基础复习 ArrayList和Vector的区别。 答:就ArrayList与Vector主要从二方面来说. 一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector ...

    某大学往年期末考试题:Java考试(含答案).docx

    某大学往年期末考试题:Java考试(含答案).docx 了解Java的基本概念和语法。复习相关教材、笔记、视频教程等。 练习编写简单的Java程序,包括控制流、循环...熟悉Java的多线程编程,包括创建线程、同步线程、线程池等。

    同步代码块(synchronized).zip

    【Java基础知识 第四节 多线程复习】中,同步代码块(synchronized关键字)的两个练习代码。

    Java面试题:为您准备的全面面试准备资源

    Java面试题资源是一份全面的准备资源,旨在...多线程:包括Java多线程编程的问题,如线程的创建与管理、线程同步和线程间通信等。这些问题将检验您对多线程编程的熟悉程度和并发控制的能力。 异常处理:涵盖了Java异

    java8集合源码分析-CollectionDemo:自己复习集合框架时候的例子

    底层是数组结构、线程同步、被ArrayList取代 判断是否存在和删除依赖的是equals方法 2.2 Set --->无序、无索引、元素不可重复 1.HashSet: 底层是Hash表,线程不同步,无序、高效 ---->内部使用的是一个HashMap...

    JAVA基础课程讲义

    线程同步和死锁问题 175 死锁及解决方案 179 生产者/消费者模式 181 线程回顾总结 184 任务调度(补充内容,了解即可!) 184 思考作业 185 上机作业 185 第十章 网络编程 186 基本概念 186 什么是计算机网络 186 ...

    Java基础面试题 91道面试复习八股文

    88. String和StringBuffer、StringBuilder的区别是什么?String为什么是不可 变的 可变性 ...StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。 性能 每次对String 类型进行改变的时候,都会

    复习synchronized之底层原理

    关键字,Java利用锁机制实现线程同步的一种方式。 Java实现线程同步的方式: 1.显式锁(lock,需要自己写代码去获取锁和释放锁); 2.隐式锁(synchronized,自动的)。 synchronized的保证的特性 原子性:被...

    2017最新大数据架构师精英课程

    10_多线程-同步代码块-同步方法 11_多线程-生产消费问题 12_多线程-死锁问题 13_字符集问题' X4 e; v9 q' U2 W% f" l7 f$ F 14_String-StringBuffer-StringBuilder 15_集合-list-arrayList-linkedlist 16_集合-...

    30天搞定Java–day20

    文章目录每日一考和复习Java常用类字符串相关的类String类String的特性String陷阱String常用方法String和其他类型转换StringBuffer类、StringBuilder类StringBuffer的常用方法效率对比JDK 8之前的日期时间API ...

    leetcode中国-myJavaNote:自己的java积累

    Java基础,Java虚拟机,Java多线程,并发工具类,Java集合框架、部分源码等。 数据库 主要针对MySQL数据库进行总结,设计数据库索引、数据库事务、数据库并发控制、主从同步等。还有一些SQL语句。 计算机网络 计算机...

    中间件期末考超强文档合集.rar

    中间件期末考复习资料包含三个文档 一、课堂考点、重点题目、考试方向思考题全解 1.什么是消息型中间件 queue 和 topic 是什么意思 答: (1) 定义:消息中间件是分布式系统中完成消息发送和接收的基本软件。 消息...

    Eclipse权威开发指南2.pdf

    10.2 复习Eclipse体系结构...... 237 10.2.1 Eclipse应用程序类型..... 240 10.2.2 Eclipse的运行..... 241 10.2.3 定义一个Eclipse应用 程序..... 242 10.3 重用Eclipse的时机...... 243 10.3.1 非UI的插件组件......

    Eclipse权威开发指南3.pdf

    10.2 复习Eclipse体系结构...... 237 10.2.1 Eclipse应用程序类型..... 240 10.2.2 Eclipse的运行..... 241 10.2.3 定义一个Eclipse应用 程序..... 242 10.3 重用Eclipse的时机...... 243 10.3.1 非UI的...

    Eclipse权威开发指南1.pdf

    10.2 复习Eclipse体系结构...... 237 10.2.1 Eclipse应用程序类型..... 240 10.2.2 Eclipse的运行..... 241 10.2.3 定义一个Eclipse应用 程序..... 242 10.3 重用Eclipse的时机...... 243 10.3.1 非UI的...

    C#微软培训资料

    <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...

Global site tag (gtag.js) - Google Analytics