本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

关于实现多线程的意义,“从业四年看并发”一文已经讲述,而本篇主要讲一下常用的设计模式和对象介绍,关于底层,请查看“Java高级之内存模型分析”。

通常情况下,狭义上来说,实现了变量或对象的原子性,即可以实现线程安全。什么叫线程的原子性,即执行read-load-assign-use-store-write这6个步骤,其一执行,则其他必执行完,因此来保证数据的同步。一般像long和double均为64位,会被拆分成2个32位执行,原则上会得到一个非64位的值,但实际上基本不会发生,也就是说它俩不具备标准的原子性。

synchronized可以说是唯一能实现标准同步的做法,底层使用monitorenter和monitorexit高级指令来实现同步块的原子性

常用的线程同步对象一般有这么几种,

1、使用synchronzied锁方法,指该方法操作完,其他线程才能操作

2、使用synchronzied锁对象,指该线程操作完此对象,其他线程才能操作

3、Lock,如ReentantLock,跟synchronized功能类似,不过它是使用lock+unlock+try/catch/finally实现,而前者使用底层指令,区别在于ReentrantLock拥有3种特性:1、等待可中断,在对象长期持胡锁的情况话,线程可以放弃等待;2、公平锁,按时间顺序来获得锁,而synchronized不同,它是非公平锁,谁抢到是谁的;3、可绑定多个条件,通过Condition对象来设置,这样可以让线程在合适的时候放弃等待或执行其他操作;在线程数量比较多的时候,synchronized具有明显优势。

4、wait+notify,阻塞线程,等待通知后执行,通常用于生产者-消费者模式

5、sleep,轻量级的同步方法,在其他线程将数据准备好之后,再执行本线程。

6、volatile,非标准同步方法,谨慎使用;主要用于保证变量对所有线程的可见性和禁止指令重排序。前者特性表现在访问变量时,每次都会从内存中重读,因此主要应用在关闭多线程的执行上来;后者指保证代码顺序执行,而非变量前面有个线程未执行完,马上就执行到此变量。

不同线程拥有不同的工作内存,像缓存机制一样,存在于处理器-工作内存-主内存系统中。变量均存在主内存中,工作内存存放主内存副本;不同线程不能直接访问对方的工作内存,只能通过主内存当桥梁来操作

线程安全的实现方法有以下3种

1、互斥同步,即同一时间仅有一条线程可以使用共享数据,是一种阻塞同步,使用wait+notify的方式

2、非阻塞同步,乐观想法-同一时间仅有一条线程对数据操作,但做好补偿策略,防止多线程同时对数据操作,采用不断尝试,直到成功的策略;这可能出现问题,但在相当程度上,会使用并发速度高出几个量级;共享数据最好使用具有原子型的。

3、无同步,数据不会被共享的则无需同步或者仅在当前线程中被使用

关于锁,研究的细致一点,发现线程切换也是耗时的,那么锁可以做哪些优化呢?

1、自旋锁和自适应锁,1.6之后默认开启自旋锁,指出现线程等待,则停留一段时间,避免线程切换;如果停留时间非常短则适应,如果停留时间特别长是浪费处理器时间,虚拟机设置自旋10次则退出;自适应锁是智能的自旋锁,智能在于能跳过某个经常需要等待多次的线程

2、锁消除,如上无同步状态,则无需加锁,重点在于避免程序自动同步,如StringBuffer的append方法,如无必要,可以使用StringBuilder代替。

3、锁粗化,如果几个方法均需加锁,而且在顺序上或时间上有次序,则可以共同放一起加锁,避免总是加锁解锁

4、轻量级锁,本意是减少重量级锁互斥产生的性能的消耗,无竞争状态下使用,加锁和解锁均通过CAS操作

5、偏向锁,解决轻量级锁在无竞争情况下,把整个同步都去掉,连CAS操作也不要了

大概关于线程同步的问题就先说这么多,回头有机会再补充。

Java高级之线程同步的更多相关文章

  1. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  2. Java中的线程同步

    Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...

  3. Java并发包——线程同步和锁

    Java并发包——线程同步和锁 摘要:本文主要学习了Java并发包里有关线程同步的类和锁的一些相关概念. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520 ...

  4. java笔记--关于线程同步(7种同步方式)

    关于线程同步(7种方式) --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897440.html"谢谢-- 为何要使用同步? ...

  5. java笔记--关于线程同步(5种同步方式)【转】

    为何要使用同步?     java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完 ...

  6. java笔记--关于线程同步(5种同步方式)

    转自:http://www.2cto.com/kf/201408/324061.html 为何要使用同步?     java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改 ...

  7. Java多线程 3 线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  8. java中实现线程同步

    为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他 ...

  9. java并发:线程同步机制之Volatile关键字&原子操作Atomic

    volatile关键字 volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchro ...

随机推荐

  1. win 8.1 安装framework3.5

    其实win8的iso上带着net 3.5的功能的,但是并没有随着系统安装二安装上去.所以只要你有跟你系统同个版本的iso文件,就可以实现不联网安装net3.5.首先把装载你的iso.Win8系统可以打 ...

  2. Spring的国际化资源messageSource

    Spring中可以使用两个类加载资源文件:ReloadableResourceBundleMessageSource和ResourceBundleMessageSource. 可配置如下message ...

  3. XMLHTTPRequest对象

    1.用于在后台与服务器交换数据: 2.XMLHttpRequest对象可以在不向服务器提交整个页面的情况下,实现局部更新网页.当页面全部加载完毕后,客户端通过该对象向服务器请求数据, 服务器端接受数据 ...

  4. 简单几何(线段相交) POJ 2826 An Easy Problem?!

    题目传送门 题意:两条线段看成两块木板,雨水从上方往下垂直落下,问能接受到的水的体积 分析:恶心的分类讨论题,考虑各种情况,尤其是入口被堵住的情况,我的方法是先判断最高的两个点是否在交点的同一侧,然后 ...

  5. Quartz.net misfire实践

      1.问题描述 在使用Quartz.net定时运行作业时,存在一种情况:作业错过了某次执行,当作业恢复的时候应该怎么处理?如:job1在3:50的时候应该执行的,但此刻job1处于暂停状态,而到3: ...

  6. POJ3694 Network(边双连通分量+缩点+LCA)

    题目大概是给一张图,动态加边动态求割边数. 本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和..好像好难写.. 看了别人的解法,这题有更简单的算法: 在任意两点添边,那 ...

  7. BZOJ4297 : [PA2015]Rozstaw szyn

    每个点的最优取值范围是一个区间,将叶子一层层剥去,得到一棵有根树,父亲的取值范围由儿子推得,时间复杂度$O(n\log n)$. #include<cstdio> #include< ...

  8. HDU 2364 (记忆化BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2364 题目大意:走迷宫.从某个方向进入某点,优先走左或是右.如果左右都走不通,再考虑向前.绝对不能往 ...

  9. Windows Phone 硬件检测

    private static bool IsWvga{ get { return App.Current.Host.Content.ScaleFactor == 100; }} private sta ...

  10. BZOJ3513: [MUTC2013]idiots

    Description 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. Input 第一行T(T<=100),表示数据组数.接下来若干行描述T组数据,每组数据第一行是n ...