文档章节

解决多线程安全问题方法

Ld_kaiyuan
 Ld_kaiyuan
发布于 2017/06/05 13:51
字数 472
阅读 25
收藏 0

1,如何保证线程安全

    不在线程之间共享状态变量

    将状态变量修改成不可变的变量

    在访问状态变量时使用同步

2,实现线程安全有那些方法

A:内置锁

Java代码

  1. public class widget{  
  2.   
  3.     public synchronized void doSomething(){  
  4.   
  5.        .....  
  6.     }  
  7.   
  8. }  
  9.   
  10. public class LoggingWidget extends Widget{  
  11.   
  12.     public synchronized void doSomething(){  
  13.   
  14.        System.out.println(toString()+":calling do Something");  
  15.        super.doSomething();  
  16.   
  17.     }  
  18.   
  19. }  

 这个时候子类同步调用父类方法是可行,因为内置锁是可以被重入的,也就是子类可以获取到父类的锁,才不会造成死锁。

 

3,使用java.util.concurrent包中定义的并发类 如 

      ConcurrentHashMap

      ConcurrentLinkedQueue

      ConcurrentSkipListMap

      等等

      但是他们支持的并发实现并不一定意味着操作的原子性,他们只是保证数据结构不被破坏

 

4,添加volatile关键字

Java代码

  1. private static volatile int value=0;//你可以添加volatile关键字 然后删除synchronized关键字,但是也要看你的业务  
  2.   
  3. public static void setTvalue(int n){  
  4.     value=n//这个时候,如果value+=n语句,那么这个就不是原子操作,还是要用synchronized的  
  5. }  

 5,同步语句的注意

      你可以使用一个对象来标记同步块,不要使用this,因为this可能代表当前的类,this造成同步的区域是整个类,其他对象就无法调用类中不是同步的方法了,需要等待锁从this指的类中释放才能进行了。所以你可以定义一个对象,然后让同步块的锁指向整个对象来缩小同步块的锁影响范围。

       

Java代码

  1. private Object myLock=new Object();  
  2.   
  3. public void add (int a ){  
  4.   
  5.     synchronized(myLock){  
  6.        
  7.         v+=a;  
  8.     }  
  9. }  

 

 6,不要在同步块中调用其他的同步块

     这句话不是绝对的,如果你很了解代码的同步,锁,等信息,你可以大胆的这么做

本文转载自:http://sdywcd.iteye.com/blog/1842751

共有 人打赏支持
上一篇: final,finally,finalize
下一篇: git 的使用
Ld_kaiyuan
粉丝 3
博文 43
码字总数 7079
作品 0
朝阳
程序员
私信 提问
Java 学习(28)---(线程的控制 / 生命周期 /解决安全问题)

线程的控制 休眠线程 加入线程 礼让线程 后台线程 终止线程 线程的生命周期 多线程安全问题 判断一个程序是否有线程安全问题的依据 ) A:是否有多线程环境 B:是否有共享数据 C:是否有多条语句...

姜白告
08/07
0
0
JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52711906 JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期...

Aduroidpc
2016/09/30
0
0
多线程(二)

线程安全问题 这里以简单的卖票程序为例开始本文的讲解,通过运行该卖票程序可以发现有可能打印出0、-1、-2等错票,这就表明多线程的运行出现了安全问题。产生的原因可归纳为两点: 线程任务...

yerenyuan_pku
2017/10/08
0
0
java多线程之ThreadLocal

java中的java.lang.ThreadLocal,为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。...

飞翔的兔兔
2017/07/11
0
0
6.JUC线程高级-Lock 同步锁

1. 解决多线程安全问题的方式: 同步代码块 同步方法 JDK1.5之前才使用上述两种方式借助于:。之后出现一个新的显示同步锁 同步锁 Lock 显示锁:必须通过 lock() 方法上锁,通过 unlock() 方...

潘天涯
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
15
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部