编写线程安全需要关心的:

1.共享的变量

2.可变的变量

共享意味着多个线程可以同时访问,可变意味着其值在生命周期可以改变。

例如以下count 变量:

//线程不安全的类

public class UnsafeCount {

private int count = 0;    //该变量是共享的

public void increase() {    //这里没有同步机制,多个线程可以同时访问

count++;    //该变量是可变的

}

public int getCount() {

return count;

}

}

有4种方式可以修复这个问题:

1.不在线程中共享该状态变量,可以将变量封装到方法中(无状态的对象一定是线程安全的);因为方法中变量是每个线程独占的,不和其它线程共享。比如:

public int add(int count){

return ++count;//这里也可以说无状态的对象一定是线程安全的

}

2.将状态变量修改为不可变的变量。

private final  int count = 0;

3.在访问状态变量使用同步策略。

public synchronized  void increase() {

count++;

}

4.使用原子变量类。

private AtomicInteger count;

public void increase() {

count.getAndAdd(1);

}

java 并发 变量_实例讲解Java并发编程之变量相关推荐

  1. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

  2. java自旋锁使用_实例讲解Java 自旋锁

    一直以来不是怎么清楚自旋锁,最近有点时间,好好的学习了一下: 所谓的自旋锁在我的理解就是多个线程在尝试获取锁的时候,其中一个线程获取锁之后,其他的线程都处在一直尝试获取锁的状态,不会阻塞!!!那么什么 ...

  3. python 西门子触摸屏通讯_实例讲解博途编程实现S7300与西门子触摸屏通讯

    原标题:实例讲解博途编程实现S7300与西门子触摸屏通讯 目前国内流行用昆仑通泰或者威纶通触摸屏做项目,一方面价格便宜,另一方面编程简单.但西门子屏也经常会被用到,所以不得不学.简单写一下会用博图建立 ...

  4. java 状态设计模式_实例讲解:Java中的状态设计模式

    Java中的状态设计模式是一种软件设计模式,当对象的内部状态更改时,该模式允许对象更改其行为.状态设计模式通常用于以下情况:对象取决于其状态,并且在运行期间必须根据其内部状态更改其行为.状态设计模式是 ...

  5. java斗地主代码_实例解析java如何实现斗地主代码

    实例解析java如何实现斗地主代码 发布时间:2020-07-20 14:41:41 来源:亿速云 阅读:73 作者:小猪 小编这次要给大家分享的是实例解析java如何实现斗地主代码,文章内容丰富,感 ...

  6. java 字符串驻留_实例讲解字符串驻留机制

    字符串驻留是一种仅保存一份相同且不可变字符串的方法.字符串驻留机制,其实就是系统维护interned字典,记录已被驻留的字符串对象. 下面我们通过实际例子探讨字符串驻留机制: Code Snip: s ...

  7. java pdf添加图章_实例讲解Java处理PDF图章的方法

    图章(印章)是一种在合同.票据.公文等文件中表明法律效应.部门机关权威的重要指示物,常见于各种格式的文件.文档中.对于纸质文档可以手动盖章,但对于电子文档,则需要通过特定的方法来实现.本篇文档分享通过 ...

  8. java 字节 操作_实例解析Java byte数组操纵方式代码

    字节数组的关键在于它为存储在该部分内存中的每个8位值提供索引(快速),精确的原始访问,并且您可以对这些字节进行操作以控制每个位. 坏处是计算机只将每个条目视为一个独立的8位数 - 这可能是你的程序正在 ...

  9. python积木式编程_实例讲解python函数式编程

    函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是"怎么干",而函数函数式编程的思考方式是我要"干什么". 至于函数式编程的特点 ...

最新文章

  1. 24个为Web开发人员准备的CSS3实用教程
  2. [小技巧]在NTFS分区中复制文件的同时如何复制权限
  3. 文本编辑器实现光标定位的功能
  4. 关闭页面刷新上层页面的几种方式
  5. 浅谈 翻硬币游戏【Nim博弈】
  6. Vue表单类的父子组件数据传递示例_vue.js_脚本之家
  7. 关于mysql-connector-net在C#中的用法
  8. java项目开发的生命周期
  9. 初识Vocaloid3
  10. 【转载】电信光猫中兴F451破解方法
  11. 微信公众号问题:{errcode:40125,errmsg:invalid appsecret, view more at http:\/\/t.cn\/LOEdzVq, hints: [ ...
  12. 二元分类(Binary Classfication)与logistic回归
  13. Android开发笔记之SeekBar 时间的显示 快进快退 Mediaplayer
  14. 企鹅,大鱼,百家,头条到底那个收益高,新手该怎么来做?
  15. 怎样把电脑默认安装C盘的位置改成D盘?
  16. 如何打开已经 force-push 的 PR (branch was force-pushed or recreated)
  17. 如何实现 List 集合去重?
  18. 信息安全等级保护分为几个级别?最高级别是什么?
  19. CVE-2022-0185 价值$3w的 File System Context 内核整数溢出漏洞利用分析
  20. CentOS7内网使用rpm方式安装MySQL5.6数据库

热门文章

  1. python获取文件名不含后缀名_大部分Python资料都没有说到的重点-用实战教你解决问题的思路...
  2. [转载] JAVA 构造函数及其重载
  3. dbms系统 rdbms_DBMS与传统文件系统之间的区别
  4. python 使用异常函数_您如何测试Python函数引发异常?
  5. python 示例_带有示例的Python File read()方法
  6. html木桶布局,CSS3如何实现图片木桶布局?(附代码)
  7. python字典怎么设置_在python中设置字典中的属性
  8. micropython 蜂鸣器_基于MicroPython的TPYBoard微信远程可燃气体报警器的设计与实现...
  9. mysql 指定数字排序_Mysql数据排序
  10. Java PrintWriter close()方法与示例