本文介绍了在Java理论与实践中,几种比较简单的非阻塞算法的工作方式。在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情。Java语言中主要的同步手段就是synchronized关键字,它强制实行互斥,确保执行synchronized块的线程的动作,能够被后来执行受相同锁保护的synchronized块的其他线程看到。在使用得当的时候,内在锁可以让程序做到线程安全,但是在使用锁定保护短的代码路径,而且线程频繁地争用锁的时候,锁定可能成为相当繁重的操作。并把原子变量用作不使用锁的并发算法的基础。 ...详细
本文介绍了多线程和并发性并不是什么新内容,但是Java语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个Thread类,可以用它来构建、启动和操纵线程,Java语言包括了跨线程传达并发性约束的构造--synchronized和volatile。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了。本文还简单介绍和比较了ReentrantLock和synchronized,以及在什么时候选择用ReentrantLock代替synchronized。...详细
本文介绍了开发人员在以编写高性能代码为目标的时候,常常会编写小的基准程序来度量一种方法相对于另一种方法的性能。与其他静态编译的语言相比,评论用Java语言编写的给定惯用法或结构体的性能要困难得多。并指出,应把注意力放在“微”基准上--编写一些实际的程序,用两种方法编写代码,开发一种逼真的负载生成策略,并在逼真的负载条件下和逼真的部署配置中使用这两种方法来度量应用程序的性能。这样做工作量会很大,但惟有如此才能更接近您想要的答案。...详细
XML作为全球通用的结构化语言,越来越受人们青睐 。在许多项目中利用XML数据交换信息,省去了许多麻烦事,不用制定繁锁的数据格式,利用XML数据易于表达,也利于一线开发者跟踪调试。在XML应用中,最常用也最实用的莫过于XML文件的读写。本文简单介绍了,JAVA中的XML编程方法。作者通过一个简单的XML文件读写来作简要分析。...详细
本文介绍了新方法内置了更多类型信息,减少了编程错误,提高了程序的可读性,但是确实带来了更多声明变量和方法签名方面的前期工作。类型参数在声明和初始化中的重复看起来尤其没有必要;Socket和Future
本文介绍了编写线程安全的类很难,而分析现有类的线程安全性更难,增强类使其仍然保持线程安全也很难。随着FindBugs的引入,在自动代码检测和审核工具方面已经取得重大进步。FindBugs利用字节码分析和很多内置的bug模式检测器来查找代码中的常见bug。它可以帮助找出代码的哪些位置有意或者无意地偏离了良好的设计原理。FindBugs几乎可以在任何时间找出实际的bug,它的每个检测器都已经在测试、产品、专业的开发代码中发现了bug。...详细
本文介绍了对于任何给定的性能问题,通过使用高速缓存来减少冗余计算或者只是添加更多的硬件,解决方案可能会与用更有效的算法进行替换一样简单。但是,要清楚地确定性能问题的根源会很困难,而设计复杂程序甚至更加困难,所以首先要使它们没有性能问题。大多数性能问题还有一个更深的起因:无法首先将性能管理、目标和测量集成到开发过程中。性能管理不仅包括优化,还包含许多其它东西。它有一个用于决定何时优化何时不优化的框架。应该根据明确的性能目标、测量和规划来做这些决策,而不是直觉。...详细
本文介绍了Java平台把线程和多处理技术集成到了语言中,这种集成程度比以前的大多数编程语言都要强很多。关于同步和线程安全的许多底层混淆是Java内存模型的一些难以直觉到的细微差别。本文还介绍了JMM有一些严重的缺点,如果正确地编写并发的类太困难的话,那么许多并发的类不能按预期工作,并且这是平台中的一个缺点。在不破坏在旧的内存模型下正确同步的任何代码的同时,我们可以创建一个与大多数开发者的直觉更加一致的内存模型,并且这一切已经由JSR 133 process完成。...详细
本文介绍了Java平台从一开始就包括了对线程的支持,包括一个计划为正确同步的程序提供“一次编写,到处运行”保证的、跨平台的内存模型,但是原来的内存模型有一些漏洞。虽然许多Java平台提供了比JMM所要求的更强的保证,但是JMM中的漏洞使得无法容易地编写可以在任何平台上运行的并发Java程序。JSR 133显著增强了volatile的语义,这样就可以可靠地使用volatile标志表明程序状态被另一个线程改变了。JSR 133还显著地增强了final的语义。极大地加强了并发程序中不变对象的效用,不变对象最终成为固有的线程安全,有效的堵住了漏洞。...详细
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式中支持散列可以促进基于散列的容器的开发和使用。本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。...详细
本文介绍了垃圾收集的好处是无可争辩的--可靠性提高、使内存管理与类接口设计分离,并使开发者减少了跟踪内存管理错误的时间。不过,垃圾收集不是没有代价的--其中包括对性能的影响、暂停、配置复杂性和不确定的结束。一个理想的垃圾收集实现应该是完全不可见的 ―― 没有垃圾收集暂停、没有因为垃圾收集而产生的 CPU 时间损失、垃圾收集器不会与虚拟内存或者缓存有负面的互动,并且堆不需要大于应用程序的 驻留空间。当然,没有十全十美的垃圾收集器,但是垃圾收集器在过去十年中已经有了很大改进。...详细
本文介绍了对于有些资源来说,一直等到终结释放它们是不可取的。对于重要的资源,Lock或Semaphore直到很晚都可能不会被垃圾收集掉。多数资源都不会持续整个应用程序的生命周期,相反,它们只被用于一个活动的生命周期。当应用程序打开一个文件句柄读取文件以处理文档时,它通常读取文件后就不再需要文件句柄了。垃圾收集为我们做了大量可怕的资源清除工作,但是有些资源仍然需要显式的释放,当资源的生命周期被绑定到特定调用帧的生命周期时,通常使用finally块来释放该资源,但是长期存活的资源需要一种策略来确保它们最终被释放。 ...详细
本文介绍了要使用多处理器系统的功能,通常需要使用多线程构造应用程序。但是正如任何编写并发应用程序的人可以告诉你的那样,要获得好的硬件利用率,只是简单地在多个线程中分割工作是不够的,还必须确保线程确实大部分时间都在工作,而不是在等待更多的工作,或等待锁定共享数据结构。通过内部公开新的低级协调原语,和提供一组公共原子变量类,现在用Java语言开发无等待、无锁定算法首次变为可行。然后,java.util.concurrent中的类基于这些低级原子变量工具构建,为它们提供比以前执行相似功能的类更显著的可伸缩性优点。...详细
本文定义了线程安全性,类要成为线程安全的,首先必须在单线程环境中有正确的行为。并在被多个线程访问时,不管运行时环境执行这些线程有什么样的时序安排,它必须有如上所述的正确行为,并且在调用的代码中没有任何额外的同步。其效果就是,在所有线程看来,对于线程安全对象的操作是以固定的、全局一致的顺序发生的。本文还介绍了线程的安全程度。描述线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。一个类的线程安全行为是其规格说明中的固有部分,应该成为其文档的一部分。...详细
本文叙述了除了科学计算和偶尔的计时测试或基准测试程序,其它情况下几乎都用不着它。同样,大多数开发人员也容易忽略java.math.BigDecimal所提供的任意精度的小数-大多数应用程序不使用它们。然而,在以整数为主的程序中有时确实会出人意料地需要表示非整型数据。在Java程序中使用浮点数和小数充满着陷阱。浮点数和小数不象整数一样“循规蹈矩”,不能假定浮点计算一定产生整型或精确的结果,虽然它们的确“应该”那样做。最好将浮点运算保留用作计算本来就不精确的数值。如果需要表示定点数,则使用 BigDecimal。...详细
本文介绍了现代JVM中的分配比执行得最好的malloc实现还要快得多。HotSpot 1.4.2之后虚拟机中的new Object()常见代码路径最多10条机器指令,而用C语言实现的执行得最好的malloc实现,每个调用平均要求的指令在60到100条之间。而且分配性能在整体性能中不是一个微不足道的部分。JVM擅长发现我们一直以为只有开发人员才能知道的事情,这令人震惊。让JVM根据具体情况在堆栈分配和堆分配之间进行选择,我们就能得到堆栈分配的性能好处,却不必让程序员在进行堆栈分配还是进行堆分配上费脑筋。...详细
本文描述的是Sun的HotSpot JVM实现未来版本的特性。每当易变的变量在线程间共享时,都必须使用同步来确保一个线程所做的更新,能够及时地被其他线程看到。同步的主要方式就是使用synchronized块,它既提供了互斥又提供了可见性保证。当两个线程都想访问共享的易变变量时,这两个线程不仅必须使用同步,而且如果它们正在使用synchronized块,那么这些synchronized 块还必须使用同一个锁对象。本文还介绍了JVM对于竞争锁请求和非竞争锁请求有不同的代码路径,分别是“慢路径”和“快路径”。...详细
这篇文章将带您探究JavaScript的一些特性,看看这些特性如何让它如此具有吸引力。高阶函数:一个高阶函数可以将函数作为参数,也可以返回一个函数。此特性让JavaScript程序员可以用Java语言所不能提供的方法来操纵函数。动态类型:通过延迟绑定,JavaScript可以更准确和更灵活。灵活的对象模型:JavaScript的对象模型使用一种相对不常见的方式进行继承——称为原型——而不是Java语言中更常见的基于类的对象模型。...详细
Sybase ASE15中新增的磁盘数据加密功能可以有效地对介质(如磁盘)上的数据进行加密,只有合法的用户才能在数据库管理下,访问到这些数据。Sybase ASE15通过自身的数据库安全机制管理数据的加解密工作,无需修改应用程序,数据库表结构也没有变化。同时,Sybase ASE15在服务器内管理密钥。密钥以一种加密格式存储在数据库的sysencryptkeys表中。...详细