`
lion_fen
  • 浏览: 14679 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

实现线程安全的几种方法

    博客分类:
  • J2SE
 
阅读更多

JDK1.5新增的功能

 

"JDK1.5"的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。 

 

下面我们简单介绍一下这些新特性。 

1.泛型(Generic) 

C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能。一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处。 

 

Collection c = new ArrayList(); 
c.add(new Date()); 

 

 

编译器会给出一个错误, 

add(java.lang.String) in java.util.Collection cannot be applied to (java.util.Date) 

2.For-Each循环 

For-Each循环得加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为: 

 

void processAll(Collection c){ 
for(Iterator i=c.iterator(); i.hasNext();){ 
MyClass myObject = (MyClass)i.next(); 
myObject.process(); 
} 
} 

 

 

使用For-Each循环,我们可以把代码改写成, 

void processAll(Collection c){ 

 

for (MyClass myObject :c) 
myObject.process(); 
} 

 

 

这段代码要比上面清晰许多,并且避免了强制类型转换。 

 

3.自动装包/拆包(Autoboxing/unboxing) 

自动装包/拆包大大方便了基本类型数据和它们包装类地使用。 

自动装包:基本类型自动转为包装类.(int >> Integer) 

自动拆包:包装类自动转为基本类型.(Integer >> int) 

在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。 

int a = 3; 
Collection c = new ArrayList(); 
c.add(a);//自动转换成Integer. 
Integer b = new Integer(2); 
c.add(b + 2); 

 

 

这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer. 

 

4.枚举(Enums) 

JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。 

 

public enum Color 
{ 
Red, 
White, 
Blue 
} 

 

然后可以这样来使用Color myColor = Color.Red. 

枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如 

for (Color c : Color.values()) 
System.out.println(c); 

 

 

5.可变参数(Varargs) 

可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象, 

util.write(obj1); 
util.write(obj1,obj2); 
util.write(obj1,obj2,obj3); 

 

… 

在JDK1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了 

public void write(Object... objs) { 
for (Object obj: objs) 
System.out.println(obj); 
} 

 

在引入可变参数以后,Java的反射包也更加方便使用了。对于c.getMethod("test", new Object[0]).invoke(c.newInstance(), new Object[0])), 

现在我们可以这样写了c.getMethod("test").invoke(c.newInstance()),这样的代码比原来清楚了很多。 

 

6.静态导入(Static Imports) 

要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。 

import static java.lang.Math.*; 
……. 

 

r = sin(PI * 2); //无需再写r = Math.sin(Math.PI); 

不过,过度使用这个特性也会一定程度上降低代码地可读性。

分享到:
评论

相关推荐

    Android 实现界面刷新的几种方法

     Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。 Android程序中可以使用的界面...

    线程安全的单例模式的几种实现方法分享

    线程安全的单例模式实现有几种思路,个人认为第2种方案最优雅:、饿汉式、借助内部类、普通加锁解决、双重检测,但要注意写法,如果单体模式继续扩展为N元单体模式,那就是对象池模式了

    C#线程锁介绍源码

    1.几种同步方法的区别 lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和...

    多线程学习23

    什么是多线程? 2:有几种方式可以实现多线程?请分别用代码实现 3:如何获取和设置线程名称 4:线程的常见方法 5:线程的生命周期图 6:线程安全的产生原因 7:如何解决线程安全问题

    java面试题(线程和JSP及EJB部分).pdf

    1、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable 接口 用synchronized 关键字修饰同步方法 反对...

    针对于Executor框架,Java API,线程共享数据

    Executor框架是Java并发编程中的一个重要工具,它提供了一种管理线程池的方式,使得我们可以更方便地管理线程的生命周期和执行线程任务。 原子操作是指不可被...在两个线程之间共享数据,可以通过以下几种方式实现:

    Java多线程详解

    文章目录1、进程与线程2、创建多线程2.1、继承Thread类2.2、实现Runnable接口2.3、使用匿名内部类实现2.4、实现Runnable接口的好处2.5、使用Callable和Future创建线程3、线程的生命周期4、几种特殊线程4.1、join线程...

    JAVA实现Modbus RTU或Modbus TCPIP数据采集.rar

    3.java同步的几种方式:synchronized,volatile,显示锁,原子变量,线程及对象的基础同步方法。 4.所谓线程安全就是当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在...

    java笔试题大集合及答案(另附各大公司笔试题)

    60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用...

    8-14 B站 C++安全开发面经 《腾讯》.docx

    6.注入:DLL注入有哪几种方法? 7.如何防止远程线程注入? 8.详细说一下 inline HOOK的原理 9.如果你在inline HOOK时候,正好有代码执行到相关位置怎么办?解决办法? 10.已知一个dll里面的很多函数(API)都被...

    C#四种方式实现对用户操作响应灵敏及可动态更新的窗体控件及其对比

    timer,backGroundWorker,多线程,委托四种方式的对比: 1.4种方式都可以实现要求 可谓条条大路通罗马 2.多线程和委托需要强行禁用CheckForIllegalCrossThreadCalls,有可能存在运行安全问题,但目前还没遇到 3....

    Golang连接池的几种实现案例小结

    而维持一个连接池,最基本的要求就是要做到:thread safe(线程安全),尤其是在Golang这种特性是goroutine的语言中。 实现简单的连接池 type Pool struct { m sync.Mutex // 保证多个goroutine访问时候,closed...

    详解iOS 多线程 锁 互斥 同步

    在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法) 会自动对参数对象加锁,保证临界区内的代码线程安全 @synchronized(self) { // 这段...

    超级有影响力霸气的Java面试题大全文档

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、...

    Jsp面试题目和答案

    线程安全的概念,实现线程安全的几种方法 抽象类和接口的区别,使用场景 hash算法的实现原理,hashcode的实现原理 error和exception的区别,RuntimeException和非RuntimeException的区别 继承与组合的区别,...

    快速跳过列表:Go中的一个快速,线程安全的跳过列表

    Go中有几种跳过列表实现。 但是,它们都以稀疏的优化和偶尔的缺点以略有不同的方式实现。 请参阅跳过列表库,以比较Go跳过列表的实现(包括基准测试)。 此存储库的目的是提供一个易于使用的界面,以适合常规数据...

    c# 单例模式的实现方法

    两者有各自适用的场景,实现方式也都很简单,唯一在设计时要考虑的一个问题就是:实例化时需要保证线程安全。 饿汉式 饿汉式实现很简单,在静态构造函数中立即进行实例化: public class Singleton { private ...

    Linux多线程服务端编程:使用muduo C++网络库

    2.5线程安全的Singleton 实现.. . . . . . . . . . . . . . . . . . . . . . . . . 48 2.6sleep(3) 不是同步原语. . . .. . . . . . . . . . . . . . . . . . . . . . . . 50 2.7归纳与总结. . . . . . . . . . . . ...

    网络安全终端实践课程设计端口扫描

    本课程设计实现一个小的端口监控软件,可以实现对指定IP地址、指定端口、指定线程完成端口扫描功能,并介绍了端口扫描的原理,通过了解入侵者如何扫描目标主机的端口,来更好的确保本机的安全性,为将来设计更为安全...

    浅谈C#单例模式的实现和性能对比

    本文会对C#中几种单例的实现方式进行介绍,并分析它们之间的线程安全性和性能差异。 单例的实现方式有很多种,但从最简单的实现(非延迟加载,非线程安全,效率低下),到可延迟加载,线程安全,且高效的实现,它们...

Global site tag (gtag.js) - Google Analytics