`
lion_fen
  • 浏览: 15500 次
  • 性别: 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); 

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

分享到:
评论

相关推荐

    3种多线程实现同步方法

    除了以上三种方法,还有其他同步机制,如条件变量(condition_variable)、信号量(Semaphore)等。在实际开发中,开发者应根据具体需求选择合适的同步策略,以确保多线程程序的正确性和性能。在设计多线程程序时,...

    线程的几种控制方式以及线程间的几种通信方式

    4. **管程(Monitor)**:Java中的`synchronized`关键字和`wait()`, `notify()`, `notifyAll()`方法其实就是一个简单的管程实现,它提供了线程安全的共享数据访问。 5. **事件(Event)**:Java的`java.util....

    线程安全型栈

    为了实现线程安全型栈,需要使用互斥机制,通过信号量对临界资源的访问进行保护。 实现线程安全型栈的主要目的在于解决多线程环境下的资源竞争问题。通过对栈的操作加上互斥机制,可以确保多个线程同时访问栈时不会...

    深入线程安全容器的实现方法

    线程安全容器的实现方法通常包括以下几种: 1. **锁机制**:最简单的方法是在需要同步的代码块周围使用`lock`关键字。这会导致执行线程等待其他线程释放锁,确保一次只有一个线程执行临界区。 2. **读写锁**:如...

    初始化多线程的几种方法

    - **线程安全**:确保在多线程环境下,代码的执行不会引发错误或不一致的结果,这通常需要同步机制来实现。 在VS2008中,你可以利用IDE提供的调试工具,如线程窗口,来查看和控制运行中的线程,这对于理解和解决多...

    浅议单例模式之线程安全(转)

    在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final Singleton INSTANCE = ...

    CVI 线程锁、线程安全变量实例

    在LabWindows/CVI中,实现线程安全变量可能需要使用特定的线程库函数,如`cvAtomicInc()` 和 `cvAtomicDec()`,它们提供原子性地增加或减少变量的值。此外,还可以使用`cvMutexVar`结构体来创建自定义的线程安全变量...

    关于如何解决HashMap线程安全问题的介绍

    为了解决HashMap的线程不安全问题,我们可以采取以下几种策略: 1. 使用Collections.synchronizedMap():Java提供了一个便捷的方法,通过Collections.synchronizedMap()可以将HashMap转换为线程安全的Map。但是需要...

    JAVA实现一个线程安全的循环单链表

    在实现线程安全的循环单链表时,还需要考虑以下几点: 1. **迭代器**:为了支持遍历链表,可以实现`Iterable`接口并提供一个线程安全的迭代器。迭代器的`hasNext()`和`next()`方法也需要使用`synchronized`关键字。 ...

    C# 高效线程安全,解决多线程写txt日志类.zip

    在C#中,实现线程安全通常有几种策略:锁(Lock)、Monitor、Mutex、Semaphore以及线程局部存储(ThreadLocal)等。 这个压缩包中的"TestConsoleApp"很可能是一个演示程序,展示了如何使用封装好的线程安全日志类。在...

    ArrayList的线程安全测试

    在给定的文件列表中,"ThreadSafe_ArrayList.csproj"可能是一个项目文件,包含实现线程安全ArrayList测试的代码。"Form1.cs"和"Form1.Designer.cs"通常用于Windows Forms应用程序,可能包含了UI界面和相关事件处理。...

    线程安全测试类

    `synchronized`关键字是Java中用于实现线程同步的关键机制,它确保同一时间只有一个线程可以执行特定的代码块或方法。当一个方法或代码块被`synchronized`修饰时,它会获取一个锁(也称为监视器锁),在该锁释放之前...

    Servlet线程安全的解决方法

    针对Servlet线程安全问题,本文将介绍几种常见的解决策略: ##### 1. 实现SingleThreadModel接口 `SingleThreadModel`接口是一个过时但仍然有效的解决方案,它的设计初衷是为了确保每个请求在一个独立的线程中执行...

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

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

    C# VS2013 收串口数据 线程安全

    在C#中,有几种方法可以实现线程安全: 1. **锁(Lock)**:使用`lock`关键字可以创建一个同步块,只允许一个线程进入。例如,当你需要读取或写入串口时,可以包裹相关代码在`lock`语句中,防止并发访问。 ```...

    几种方法编写线程代码

    总的来说,编写线程代码需要深入理解多线程的概念,掌握各种创建和管理线程的方法,并确保线程安全和高效性。在实际项目中,结合使用`ExecutorService`和线程池通常是最佳实践,因为它们提供了更好的性能和资源管理...

    操作系统课设-线程安全的双链表

    要实现线程安全的双链表,我们有几种常见的策略: 1. **互斥锁(Mutex)**:每个操作(如插入、删除)都先获取锁,操作完成后释放锁。这样确保了同一时间只有一个线程能执行这些操作,从而避免了竞态条件。然而,这...

    线程安全的单例模式

    ### 线程安全的单例模式详解 #### 一、单例模式简介 ...通过上述几种不同的实现方式,我们可以根据实际需求选择最适合的一种。其中,双重检查锁定因其较高的性能和线程安全性,成为了较为推荐的做法。

    VC多线程中控制界面控件的几种方法

    ### VC多线程中控制界面控件的几种方法 在VC++(Visual C++)开发环境中,特别是使用MFC(Microsoft Foundation Classes)框架时,处理多线程与GUI(图形用户界面)之间的交互是一个常见的需求。为了确保程序的稳定...

Global site tag (gtag.js) - Google Analytics