原标题:Java并发编程:核心理论之数据共享性

并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。本系列会从线程间协调的方式(wait、notify、notifyAll)Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式、实现源码及其背后的原理。本文是该系列的第一篇文章,是这系列中最核心的理论部分,之后的文章都会以此为基础来分析和解释。

一、共享性

数据共享性是线程安全的主要原因之一。如果所有的数据只是在线程内有效,那就不存在线程安全性问题,这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。但是,在多线程编程中,数据共享是不可避免的。最典型的场景是数据库中的数据,为了保证数据的一致性,我们通常需要共享同一个数据库中数据,即使是在主从的情况下,访问的也同一份数据,主从只是为了访问的效率和数据安全,而对同一份数据做的副本。我们现在,通过一个简单的示例来演示多线程下共享数据导致的问题:

代码段一:

package com.paddx.test.concurrent;

public class ShareData {

public static int count = 0;

public static void main(String[] args) {

final ShareData data = new ShareData();

for (int i = 0; i < 10; i++) {

new Thread(new Runnable() {

@Override

public void run() {

try {

//进入的时候暂停1毫秒,增加并发问题出现的几率

Thread.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

for (int j = 0; j < 100; j++) {

data.addCount();

}

System.out.print(count + " ");

}

}).start();

}

try {

//主程序暂停3秒,以保证上面的程序执行完成

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("count=" + count);

}

public void addCount() {

count++;

}

}

上述代码的目的是对count进行加一操作,执行1000次,不过这里是通过10个线程来实现的,每个线程执行100次,正常情况下,应该输出1000.不过,如果你运行上面的程序,你会发现结果却不是这样。下面是某次的执行结果(每次运行的结果不一定相同,有时候也可能获取到正确的结果):

可以看出,对共享变量操作,在多线程环境下很容易出现各种意想不到的的结果。

来源:http://www.cnblogs.com/paddix/p/5374810.html

责任编辑:

java并发数据共享机制_Java并发编程:核心理论之数据共享性相关推荐

  1. Java 并发编程—核心理论

    原文作者:liuxiaopeng 原文地址:Java 并发编程:核心理论 目录 一.共享性 二.互斥性 三.原子性 四.可见性 五.有序性 六 总结 并发编程是Java程序员最重要的技能之一,也是最难 ...

  2. java的多线程机制_Java多线程开发(一)| 基本的线程机制

    0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...

  3. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  4. 说一下java的运行机制_Java运行机制是什么?

    不管是学习Java还是其他什么变成语言,我们不仅要了解它的特性,充分的使用Java语言完成各种程序开发工作,还要了解Java的运行机制.只有了解其底层的运行机制,才能更好的利用Java完成各项工作.J ...

  5. java程序并行机制_Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点。A.多线程B.健...

    Java语言具有多种优点和特点,下列选项中,______反映了Java程序并行执行机制的特点.A.多线程B.健 更多相关问题 根据句意及首字母完成单词1. -What c__________ is i ...

  6. java final内存机制_Java中的内存处理机制和final、static、final static总结

    装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JV ...

  7. java的响应机制_JAVA事件响应机制

    JAVA事件响应机制 1,先自定义一个事件 public class MyEvent extends java.util.EventObject{ public MyEvent(Object sour ...

  8. java tcp 心跳机制_Java实现心跳机制的方法

    一.心跳机制简介 在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效.为了检测对方节点的有效性,每隔固定时间就发送一个固定信息给对方,对方回复一个固定信息 ...

  9. java 服务器 http请求_Java网络编程——发送HTTP请求到服务器

    当Java程序需要向服务器发送请求或读取服务器数据时,使用URLConnection类是比较好的选择.URLConnection类封装了与服务器互动操作的方法,通过它可以建立与服务器的远程连接,检查服 ...

最新文章

  1. 工作中使用计算机的经验,事业单位考试中计算机工作经历是什么意思
  2. python如何对人数向上取整_python中的向上取整向下取整以及四舍五入的方法
  3. web.xml 中的filter
  4. Mac下ssh支持auto complete
  5. try-catch-finally的返回值问题
  6. linux找不到mysql服务_linux mysql 找不到 mysql/mysql.h
  7. 浪曦视频在线的ASP.NET AJAX视频教程下载(转载)
  8. 数据分析--优化模型
  9. vim中替换字符串的方法有哪些
  10. 网上车市通过聆讯:营收单一,上半年减员15%,徐翀持股80%
  11. android 验证手机、邮箱格式
  12. 浅谈“异常信息泄露(应用程序错误)”
  13. Android JSON:Gson,FastJson解析库的使用和对比分析(1)
  14. 微信撤回消息在服务器可以看到吗,微信撤回消息可以查看了,对方撤回了什么一目了然...
  15. usc week 5 计算几何(包含凸包) 队内练习题
  16. 【计算机网络】6. 网络基础4之详解IP协议( IP协议头格式、IP地址管理、路由选择)
  17. 刷题的目的及注意事项
  18. 分支语句和循环语句<小罗爱学c语言>
  19. 农业信息化技术与应用案例test
  20. 软件著作权申请注意事项——计算机软件著作权登记申请(R11申请)流程

热门文章

  1. matlab 图像坐标系
  2. 批量修改数据_#泰Q头条#065期 四步搞定Excel表中的批量数据修改
  3. MATLAB集合运算
  4. AUTOSAR专业知识篇(八)-大众ID.4 X网络架构详解
  5. 对着爬虫网页HTML学习Python正则表达式re
  6. 少儿编程100讲轻松学python(十二)-python如何将数据写入txt
  7. 街机linux有安卓好吗,Ubuntu下用xmame玩街机游戏
  8. 把ipa文件上传到服务器,windows电脑上传ipa到appstore的详细流程
  9. key value vue 输出_vue注意事项总结(一)
  10. 小程序在wxml页面中取整