提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|行业资讯|编辑:龚雪|2014-05-22 09:40:35.000|阅读 342 次
概述:介绍了解ava并发编程原理,工作状态,模块模式等,从而快速掌握Java并发编程,并附上各种资源工具。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
Java作为最流行的编程语言之一,随着 Java 8的到来,越来越多的人开始学习,并深入研究!下面将介绍 Java并发编程,让开发者在最短的时间里掌握并发编程。
1.1. 什么是并发?
并 发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可 交互性将大大改善。现代的PC都有多个CPU或一个CPU中有多个核。是否能合理运用多核的能力将成为一个大规模应用程序的关键。
1.2. 进程 vs 线程
进程是以独立于其他进程的方式运行的,进程间是互相隔离的。一个进程无法直接访问另一个进程的数据。进程的资源诸如内存和CPU时间片都是由操作系统来分配。
线程又被称为轻量级进程。每个线程有它独自的调用栈, 但是在同一进程下的线程又能互相访问它们间的共享数据。每个线程都有它独自的缓存。如果一个线程读取了某些共享数据,那么它将这些数据存放在自己的缓存中以供将来再次读取。
一个 Java应用程序默认以一个进程的形式运行着。在一个 Java程序中,你将协同多个不同的线程一起完成并行运算或实现异步行为。
2.1. 并发性能的上限
之所以并发号称能较快的完成某些任务是因为这些任务能被分组成多个子任务,并且这些子任务能被并行的执行。所以一个任务的实际运行效率将受限于该任务中能并行执行的部分。
一个程序理论上可达到的最高并发性能可通过以下一个被称为Amdahl 定律来计算出:
设F为一个程序中不能被并行执行的百分比,N是处理器的数量,那么理论上该程序能获得的最高并发性能将可能是1/ (F+ ((1-F)/n)).
2.2. 并发问题
线程有独自的调用栈,但是又能互相访问共享的数据。所以这里你会遇到两个问题,可见性和访问。
可见性问题发生于如果线程A先读取了某些共享数据,之后线程B对这些数据进行了修改,那么线程A可能看不到线程B对这数据的改动。
访问问题发生于于多个线程同时访问修改同一个共享数据。可见性及访问问题将导致:
活跃性失败——由于并发访问数据导致程序无任何反应。 譬如,死锁。
安全性失败——程序创建了错误的数据。
3.1. 进程与线程
一个 Java程序默认以一个线程运行在自己的进程中。 Java语言通过Thread相关代码来支持线程。 Java程序可通过Thread这个类来创建线程。从 Java1.5起,在 Java.util.concurrent中提供了改进的并发库。
3.2. 锁和线程同步
Java提供了“锁” 机制来保护代码片段免于被多个线程在同一时刻运行。最简单的锁住一个方法或一个类就是在该方法或类前添加synchronized关键字
保证了在Java中synchronized关键字保证了在同一时刻,只有单个线程能访问这块代码,每个进入这同步代码块的线程都将能看到之前持有相同锁进入的线程的所做的改动.对于线程间的可靠通讯及互斥访问 来说,同步是非常必要的
你可以在定义方法时使用synchronized关键字。这个关键字保证了同一时刻只有一个线程能运行这个方法。其他同样调用了这个方法的线程将被阻塞直到第一个线程离开这个方法。
1 public synchronized void critial() { 2 // some thread critical stuff 3 // here 4 }
你同样也能用synchronized关键字来保护方法中的代码块。这块代码将由一个关键对象来保护,该关键对象可以是个string或其他object。这个关键对象就被称为 lock。所有被相同lock保护的代码在同一时刻只能被单个线程执行。
举例来说,以下的数据结构将保证同时只有单个线程可以访问add和next方法:
01 package de.vogella.pagerank.crawler; 02 03 import Java.util.ArrayList; 04 import Java.util.List; 05 /*** Data structure for a web crawler. Keeps track of the visited sites and keeps 06 * a list of sites which needs still to be crawled. 07 * @author Lars Vogel 08 */ 09 public class CrawledSites { 10 private List<String> crawledSites = new ArrayList<String>(); 11 private List<String> linkedSites = new ArrayList<String>(); 12 13 public void add(String site) { 14 synchronized (this) { 15 if (!crawledSites.contains(site)) { 16 linkedSites.add(site); 17 } 18 } 19 } 20 /** * Get next site to crawl. Can return null (if nothing to crawl) */ 21 public String next() { 22 if (linkedSites.size() == 0) { 23 return null; 24 } 25 synchronized (this) { 26 <em>// Need to check again if size has changed</em> 27 if (linkedSites.size() > 0) { 28 String s = linkedSites.get(0); 29 linkedSites.remove(0); 30 crawledSites.add(s); 31 return s; 32 } 33 return null; 34 } 35 } 36 37 }
3.3. Volatile
如果一个变量声明时使用了volatile 关键字,那么该关键字保证了,任何读取该变量的线程都将读到最新写进该变量的值。但volatile 关键字不会保证变量上的任何互斥访问。
因为在 Java 5中,对一个声明了volatile 的变量进行写操作会导致该写操作所在该线程之前所有的对非volatile 变量的修改进行同步更新。这也可用来更新引用类型变量。例如,有个volatile 类型的变量person。你必须创建一个临时变量person,然后调用SETTER方法来初始化这变量然后将临时变量赋值给final变量。 这会使这个变量的地址发生改变并且此变量的值对于其他线程变为可见。
4.1. 概览
Java内存模型描述了线程内存与主存间的通讯关系。
Java内存模型定义了线程内的内存改变将怎样传递到其他线程的规则,同样也定义了线程内存与主存进行同步的场景,也描述了哪些操作属于原子操作及操作间的顺序。
4.2. 原子操作
一个原子操作是指一个执行时不会被其他操作影响到的最小单位的操作。
Java语言规范保证了对一个变量的读和写操作都是原子的(除了LONG和DOUBLE类型的变量)。对于LONG或DOUBLE类型的变量,只有当这些变量声明时使用了volatile关键字才是原子的
假设定义了一个INT变量I,那么在 Java中,I++操作不是一个原子操作。同样,这对于其他数字类型的变量也都不是一个原子操作。
I++操作先从I中读取了当前值(这是个原子操作)然后再让它加上1写回(原子操作)。但是在读和写这两个操作间,I的值有可能被改变。
从 Java1.5起, Java提供了原子变量,例如AtomicInteger 或 AtomicLong 都提供了类似 getAndDecrement(), getAndIncrement() 及 getAndSet()等原子方法。
4.3.同步代码块的内存更新
Java内存模型保证了每个进入相同锁同步块的线程都能看到之前进入的其他所有线程修改的结果。
温馨小提示:好的资源,在 Java开发中能事半功倍!
Java并发编程基础://ifeve.com/java-concurrency-cookbook/
业界被公认为最好的Java开发平台:IntelliJ IDEA
最实惠、综合全面的J2EE IDE与Web开发工具套件:MyEclipse
多平台Java安装文件生成工具:install4j
全面测试Java程序的工具:Parasoft Jtest
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
本文将为大家深入介绍QtitanDataGrid组件,看看它是如何为Qt开发提供强大的数据表格解决方案的,欢迎下载最新版组件体验!
在现代工业自动化领域,OPC协议在设备、系统和软件之间的数据交换中发挥着重要作用。随着技术的进步,传统的OPC DA协议逐渐暴露出一些不足,比如跨平台支持差、安全性不足等问题,OPC UA作为其升级版应运而生,具有更强的灵活性、安全性和跨平台能力。那么,如何将原本使用OPC DA的系统或设备迁移到OPC UA协议呢?
在工业自动化领域,OPC协议被广泛应用,它帮助不同品牌、不同类型的设备和系统之间实现数据交换。OPC协议有多个版本,其中最常见的有OPC DA和OPC UA。虽然它们都属于OPC协议家族,但这两者有许多重要的区别。那么,OPC DA和OPC UA究竟有什么不同?
业界一致肯定的、最佳多平台Java安装文件生成工具
IntelliJ IDEAIntelliJ在业界被公认为优秀的Java开发平台之一,在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面表现突出,并支持基于Android平台的程序开发。
MyEclipse功能最全面、性价比最高的企业级Java IDE之一
Parasoft Jtest用于应用软件开发的集成Java测试工具
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢