线程同步

什么情况需要用到?
当多个线程同时操作一个可共享的资源变量时,有可能产生冲突,为了避免这种冲突引入了线程同步的概念。

作用?
保证了对共享资源访问的唯一性。

举个例子:
我们去食堂吃饭,有一个阿姨负责打饭菜,她同时给几个人打菜,但有时候会给人打错菜,那去吃饭的人就有意见了,于她为了避免这样的问题,于是规定菜饭需要排队,每次只给一个人打菜,这样就比较公平了。
这个例子是告诉我们,同步就和排队一样,虽然能避免冲突,但也是会影响效率的,但是在某些场合, “公平”却显得更总要一些。

线程同步有几种方法:
1.synchronized关键字修饰
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

同步方法
public synchronized void save(){}
同步代码块
synchronized(object){}

因为同步是一种高开销操作,因此应该尽量减少同步的内容,只同步关键代码就可以。

2.volatile关键字
用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,因此每次使用该域就要重新计算,而不是使用寄存器中的值,不能用来修饰final类型的变量。

例如:private volatile int account = 100; //此变量在做其他操作时即可实现线程同步

3.重入锁实现线程同步
JavaSE5.0中新增了一个java.util.concurrent包来支持同步使用的时候new ReentrantLock()对象,调lock()获得锁,关键代码执行完毕后调用unlock()释放锁。

4.局部变量实现线程同步
如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

ThreadLocal() : 创建一个线程本地变量
get() : 返回此线程局部变量的当前线程副本中的值
initialValue() : 返回此线程局部变量的当前线程的"初始值"
set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

疑问?虽然是有副本,但源头同时被两个人调用,两个都修改了源值,一个先保存了,另一个还未保存的副本修改的内容就没有意义了?

5.队列实现线程同步
LinkedBlockingQueue:
实现了先进先出等特性,队列满的时候会阻塞直到有队列成员被消费,队列空的时候会阻塞,直到有队列成员被放进来。内部对数据的读写采用了锁的机制,和重入锁的概念一致,他的作用是让使用者交替访问共享的资源,避免数据错乱。

总结一下:
1.线程同步一定是多个线程访问同一个资源。
2.只有共享资源的读写访问才需要同步。
3.只有“变量”才需要同步访问。
4.使用synchronized关键字同步,应尽量缩小范围。
5.非线程安全不等于不安全,比如同时访问一个资源,但我每个线程都new一个这个资源对象做操作也不存在安全问题的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...
    Mitchell阅读 1,973评论 1 7
  • 在之前的文章java面试 synchronized关键字中,已经详细的介绍了synchronized关键字的用法和...
    步积阅读 2,496评论 1 4
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,690评论 0 11
  • 亲爱的家人们,好消息!应我们的特别邀请,Maya老师将在8月25—29日到武汉、国庆节到江苏苏州开班啦! ...
    燕鸣46786阅读 1,097评论 0 0
  • 近期在重读这本书,复盘之前的产品工作,对理论型的书籍有更进一步的感悟。阅读理论容易,理解并时刻放入日常工作中,并不...
    iq小卡阅读 354评论 0 1