JAVA 1.5 局部特性(可变参数/ANNOTATION/并发操作)

洪祺
2023-12-01

1: 可变参数

可变参数意味着可以对某类型参数进行概括,例如十个INT可以总结为一个INT数组,当然在固定长度情况下用数组是很正常的

这也意味着重点是可变,不定长度的参数

 

PS1:对于继承和重写我没有多做测试,具体可以参考 http://www.cnblogs.com/lanxuezaipiao/p/3190673.html

PS2:可变的参数只可以放在参数列表最后一位,所以函数里只能有一个可变参数

 

public class Cal {
    public static Integer add( Integer... args)
    {
        Integer result = 0;
        for (Integer integer: args)
        {
            result += integer;
        }
        return result;
    }
    static public void main(String[] arg)
    {
        System.out.print(add(1,2,3,4,5));
    }
    //out put = 15
}

  

2:ANNOTATION

Annotation给我的感觉就是让开发更加的简便,在原有基础上可以做更多的修饰。

最常见的就是 @override @deprecated 可以明确的指出当前 函数 / 类 / 成员 的一些特性,而且可以给与一定操作,例如告诉你不能使用等等

同时在反射Reflect包中出现了与annotation有关的函数,例如 是否annotation 、 查询annotation的成员值

这个和 IOC 配合起来可以起到很好的效果  example roboguice(可以在github里搜到)

为参数 inject 指定类

 @InjectView(R.id.name)             TextView name; 
        @InjectView(R.id.thumbnail)        ImageView thumbnail; 
        @InjectResource(R.drawable.icon)   Drawable icon; 
        @InjectResource(R.string.app_name) String myName; 
        @Inject                            LocationManager loc; 

例如在spring里是在XML文件内对各种类绑定来绑定去,虽然都统一在一个地方,但是看起来也挺费劲的

改用annotation可以在类出现的地方看到配置参数,我觉得更加的人性化

 

3. 并发操作

   

  1.CopyOnWriteArrayList

  传统的ArrayList 不是线程安全的,如果一个线程在读一个线程在写 会出现ConcurrentModificationException

  所以CopyOnWriteArrayList就诞生了,在读取部分是和ArrayList差不多,不存在并发问题,主要是在写入的部分,

  CopyOnWriteArrayList采取的方法是先把整个数组复制一份,执行ADD操作,然后再把新数组塞回去,那么在运行着的旧数组是不会被影响到的所以不会报错

  明显的缺点就是每个操作需要复制完整的数组,所以这个类适用于多读少写的场合

 

  2.concurrent里的 atomicXXX

  一般执行并发控制靠的都是锁,其中的缺点就是建立锁和释放锁都需要耗费相当的CPU资源,而且很多时候根本就没人和你抢

  这种情况下用atomic就比较适合了

  以compareAndSet作为例子,先获取值(正常取值),然后用compareAndSet对当前值进行对比

    1, 如果值没变化,那么就变成新的设定值

    2, 如果值发生了变化,返回false,再继续取值去

public class NonblockingCounter {
    private AtomicInteger value;
    public int getValue() {
        return value.get();
    }
    public int increment() {
        int v;
        do {
            v = value.get();
        while (!value.compareAndSet(v, v + 1));
        return v + 1;
    }
}

  

  关于非阻塞的算法,请看这边 http://www.ibm.com/developerworks/cn/java/j-jtp04186/

转载于:https://www.cnblogs.com/rockman12352/p/3788244.html

 类似资料: