我在使用ReentrantLock类对变量进行多线程累加时,调用了lock()和unlock()方法,但读取该变量时我未加锁,结果是能正确执行,代码如下:

public class Main {

private long count;

private ExecutorService pool;

private Lock lock = new ReentrantLock();

/**

* @param args

*/

public static void main(String[] args) {

new Main().countThread();

}

public Main() {

pool = Executors.newFixedThreadPool(50);

}

public void countThread() {

for (int i = 0; i

pool.execute(new Runnable() {

@Override

public void run() {

lock.lock();

try {

count++;

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

});

}

while (true) {

System.out.println(count);

if (count == 3000) {

break;

}

}

System.out.println(count);

pool.shutdown();

}

}

http://www.infoq.com/cn/articles/java-memory-model-1

这篇文章介绍了Java内存模型定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。

能不能这样理解,类中的全局变量是存储在主内存。也就是读操作不需要锁,不知道理解是否正确。

合理解释:

主存的变量,线程的本地内存会有一个副本这没错.可是两者有一个同步时机的问题,所以你这样用是不安全的.

要么两边都同步保护,要么你增加"volatile"关键字提示这个变量不能创建本地副本.

Java 并发包中的读写锁及其实现分析

1. 前言 在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时 刻可以允许多个读线程访问,但是在写线程访问时,所有 ...

Java中的读写锁

一.读写锁 1.初识读写锁 a)Java中的锁——Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...

Java并发包中线程池ThreadPoolExecutor原理探究

一.线程池简介 线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供更好的性能,在不使用线程池时候,每当需要执行异步任务的时候直接new一个线程来运行的话,线程的创建和销毁都是需要 ...

java中ReentrantReadWriteLock读写锁的使用

Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读 ...

Java线程:条件变量、原子量、线程池等

一.条件变量 条件变量实现了java.util.concurrent.locks.Condition接口,条件变量的实例化就是通过一个Lock对象上调用newCondition()方法获得的,这样条件 ...

MFC 中线程传递CString 是不安全的 转

MFC 中线程传递CString 是不安全的       在MFC中,向线程传递CString变量参数时,很容易犯一个错误,就是使用一个超出生存期的变量,在主函数中定义的CString变量是局部变量 ...

java中线程和并发面试题

http://www.cnblogs.com/dolphin0520/p/3932934.html http://www.cnblogs.com/dolphin0520/p/3958019.html ...

Java并发编程中线程池源码分析及使用

当Java处理高并发的时候,线程数量特别的多的时候,而且每个线程都是执行很短的时间就结束了,频繁创建线程和销毁线程需要占用很多系统的资源和时间,会降低系统的工作效率. 参考http://www.cnb ...

Java 中线程安全问题

不好意思,一个国庆假期给我放的都不知道东西南北了,放松,很放松,差一点就弃更了,感谢那些催更的小伙伴们! 虽然没有更新,但是日常的学习还是有的,以后我尽量给大家分享一些通用知识,非技术. 但是本期还是 ...

随机推荐

HTML中添加背景音乐

C学习笔记 知识集锦(一)

1.标识符  2.寄存器变量 3.全局变量 4.分配内存与初始化 5.变量定义与声明 6.作用域规则 跳转语句 7.&与&&,|和||的意义与区别 8.如何选择switch c ...

Tomcat学习 HttpConnector和HttpProcessor启动流程和线程交互

一.tomat启动流程 1.启动HttpConnector connector等待连接请求,只负责接受socket请求,具体处理过程交给HttpProcessor处理. tomcat用户只能访问到co ...

POJ 3162 Walking Race 树形DP+线段树

给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成 ...

elasticsearch-head 的搭建

elasticsearch-head 全部是js和html5写的,elasticsearch 全部都是http的接口, 这样,只需要简单地本地配置一个虚拟站点,就可以搭建  elasticsearch ...

[Hadoop源码解读](三)MapReduce篇之Job类

下面,我们只涉及MapReduce 1,而不涉及YARN. 当我们在写MapReduce程序的时候,通常,在main函数里,我们会像下面这样做.建立一个Job对象,设置它的JobName,然后配置输入 ...

asp.net mvc4 Controller与Action执行过程的研究(学习笔记)

当IIS收到一个http请求,把请求信息发给对应的HttpModel(实际是实现类UrlRoutingModule),在HttpModel中会注册HttpApplication 类中的PostReso ...

div行高不确定,文字和图片居中

// 加在父级div中 垂直居中:align-items:center; display: -webkit-flex;水平居中:justify-content:center; display: -we ...

一款用于对 WiFi 接入点安全进行渗透测试的工具

越来越多的设备通过无线传输的方式连接到互联网,以及,大范围可用的 WiFi 接入点为攻击者攻击用户提供了很多机会.通过欺骗用户连接到虚假的 WiFi 接入点,攻击者可以完全控制用户的网络连接,这将使得 ...

poj2478 Farey Sequence 欧拉函数的应用

仔细看看题目,按照题目要求 其实就是 求 小于等于n的 每一个数的 欧拉函数值  的总和,为什么呢,因为要构成 a/b 然后不能约分  所以 gcd(a,b)==1,所以  分母 b的 欧拉函数值   ...

c语言哪些变量不要加锁,[转]关于ReentrantLock中线程读某个变量是否需要加锁相关推荐

  1. python实例变量初始化_Python – 应该在__init__中初始化所有成员变量

    也许这更像是一个样式问题,而不是技术问题,但我有一个带有几个成员变量的python类,我想让它工作,以便在用户首次创建类的实例时初始化一些成员变量(即在__init__函数中)我希望从稍后将调用的成员 ...

  2. python在另一个函数中使用其他函数的变量_在另一个函数中访问函数的变量,如function() . var in python...

    我在寻找一种正确的方法来访问另一个函数中的函数变量时遇到了一些问题 . 我正在制作远程操作类工具,因此我需要处理接收的命令[如'exit'或'nircmdc.exe'或'telnet'等] . 下面的 ...

  3. java 不加锁_在java中,在高并发的时候,不加锁的时候。

    java语句为什么时候要加问号?因为它是一个语句,比如 int i; Test t=new Test(); t.te(); 需要加分号的时候说明它也形成了一个语句,一般就是匿名内部类了 比如说 abs ...

  4. 在c语言中我叫做符号变量,问渠网-C语言基础-第一节 关键字符号与变量

    一.关键字与符号: 1.关键字 auto    double    int    long    break    else    long    switch case    enum    reg ...

  5. python变量如何用循环定义_Python学习日记1(变量定义,分支,循环)

    学习历程按照Github上jackfrued的100天学习python的进度来进行,再辅上一些自己查找的相关资料. 对应传送门:https://github.com/jackfrued/Python- ...

  6. linux内核中的每cpu变量

    一.linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句.从语句的意思可以看出是要使用与当 ...

  7. js 中对于 css 的变量操作(React也可)

    文章目录 前言 一.设置CSS变量? 二.读取变量 三.删除变量 总结 前言 主要讲js 中对于 css 的变量操作: 前端框架:antd框架 一.设置CSS变量? document.body.sty ...

  8. oracle环境变量配置教程,oracle_window中oracle环境变量设置方法分享,window server中Oracle的环境变量设 - phpStudy...

    window中oracle环境变量设置方法分享 window server中Oracle的环境变量设置 1.右击"我的电脑"->选择"属性"->选择 ...

  9. c语言 多个线程对同一变量执行memcpy_PHP 进阶之路 - 揭开 PHP 线程安全的神秘面纱

    变量的作用域 从作用域上来说,C语言可以定义4种不同的变量:全局变量,静态全局变量,局部变量,静态局部变量. 下面仅从函数作用域的角度分析一下不同的变量,假设所有变量声明不重名. 全局变量(int g ...

最新文章

  1. python logger
  2. 《head first java 》读书笔记
  3. tensorflow学习:分布式tensorflow使用,代码实现inGraph方式
  4. bzoj 3196/tyvj p1730 二逼平衡树
  5. java有趣的平方数_JAVA小程序之独特的完全平方数问题
  6. 2013年第8周日元宵节
  7. Linux crontab 详细介绍及执行php
  8. 如何通过JS获取元素宽高
  9. 优麒麟(Ubuntu Kylin)安装日志
  10. wincc项目 CS结构 ES工程师站下装到OS服务器失败或者特别慢的原因
  11. LeetCode每日一题495. 提莫攻击
  12. 滴滴当年重创的安全事件,也会重创货拉拉吗?
  13. 软件工程考研笔记整理(三小时速成)(3)
  14. iic的SDA引脚偶尔有毛刺(尖峰)是怎么回事。
  15. 64位处理器 计算机,32位与64位的处理器有什么区别?
  16. 如何有效的解决文件锁定问题
  17. latex 学习使用记录(插图片,插表格,插公式,插参考文献)
  18. 那些年我们在python掉进的坑系列之一pandas的to_sql
  19. PLC编程学习日记1
  20. java 截屏 效率_Java:在Windows里实现快速截图

热门文章

  1. PDF转word免费在线转换
  2. c#自定义控件绘制五角星形状
  3. 一文了解NFT的六大交易平台
  4. oj记录 牛客小I白月赛50 C减法与求余 (思维
  5. COM编程入门 第一部分——什么是COM,如何使用COM
  6. Java代码实现n的阶乘
  7. 液压控制系列之活塞位置测量(带原点标定功能)
  8. 跳槽多次后,月薪等于老同事的年薪
  9. 东莞市速网五金制品有限公司1*4光纤笼子规格书
  10. 杰理之FM 模式单声道或立体声选择设置【篇】