文档章节

解决多线程安全问题方法

Ld_kaiyuan
 Ld_kaiyuan
发布于 2017/06/05 13:51
字数 472
阅读 19
收藏 0
点赞 0
评论 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

共有 人打赏支持
Ld_kaiyuan
粉丝 2
博文 42
码字总数 7079
作品 0
朝阳
程序员
Servlet线程安全

当多个客户端并发访问同一个Servlet时,web服务器会为每一个请求创建一个线程,并在这个线程上调用Servlet的service方法,因此如果service方法内如果操作了同一个资源的话,就可能出现线程安全问...

木子丰 ⋅ 2015/03/11 ⋅ 0

多线程(二)

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

yerenyuan_pku ⋅ 2017/10/08 ⋅ 0

Java多线程与静态方法

在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题? public class Test { public static void operation(){ // ... d...

初雪之音 ⋅ 2014/04/06 ⋅ 0

day23-----------多线程(传智视频)

多线程概述 package cn.itcast_01;/* * 进程: * 正在运行的程序,是系统进行资源分配和调用的独立单位。 * 每一个进程都有它自己的内存空间和系统资源。 * 线程: * 是进程中的单个顺序控制...

萧小蚁 ⋅ 2016/02/23 ⋅ 0

你敢说自己了解单例模式?

一、背景   最近在学习设计模式,在看到单例模式的时候,我一开始以为直接很了解单例模式了,实现起来也很简单,但是实际上单例模式有着好几个变种,并且多线程中涉及到线程安全问题,那么...

hafiz.zhang ⋅ 2017/09/27 ⋅ 0

JDK源码学习之ThreadLocal

ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 Th...

孟飞阳 ⋅ 2016/07/05 ⋅ 0

Spring单例与线程安全小结

一、Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方。 单例模式的意思就是只有一个实例。单例模式确...

勇敢的蜗牛_Z ⋅ 2016/04/07 ⋅ 0

Spring单例与线程安全小结

一、Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方。 单例模式的意思就是只有一个实例。单例模式确...

java梦想家01 ⋅ 2016/02/18 ⋅ 2

Java并发编程--从一个线程不安全的例子说起

并发问题再也不是一个只有高级程序员才能接触的问题了,在使用多线程编程的时候,我们更多的将目光放在追求系统的高并发和高吞吐,而这一切的前提是确保程序的正确性。在多线程编程中容易产生...

Gaischen ⋅ 2012/10/27 ⋅ 0

ThreadLocal 基础知识

ThreadLocal是什么 · 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...

向阳而生 ⋅ 2015/11/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 26分钟前 ⋅ 0

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明。 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个...

honeymose ⋅ 30分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 42分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 47分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 49分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 55分钟前 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 58分钟前 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 58分钟前 ⋅ 0

only_full_group_by

我的mysql是在CentOS7.1下面的5.7.17 在 /etc/my.cnf 文件里加上如下: sql_mode='NO_ENGINE_SUBSTITUTION' 然后,重启Mysql服务 systemctl restart mysqld...

SunHacker ⋅ 今天 ⋅ 0

实际项目(SpringBoot项目)中集成Druid

参考网页 https://blog.csdn.net/liuchuanhong1/article/details/55050131 https://blog.csdn.net/CoffeeAndIce/article/details/78707819 https://www.pocketdigi.com/20170530/1577.html 为......

karma123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部