Atomic
普通情况需要线程安全我们会选择用synchronized。
但是这样有时候会因为程序错误造成死锁,或者根本就没有用对地方导致根本就没有同步。所以使用synchronized的时候需要仔细的测试。
JAVA 1.5以后提供了一个新的包 java.util.concurrent,里面有很多为线程并行程序提供支持的类。
而这个包下面还有一个包:java.util.concurrent.atomic,其中就有这么一系列Atimic类
例如,最简单的AtomicInteger
,这个类像包装类Integer一样,可以包装出一个整型变量。然后用这个类下面的一些方法来操作,get(), getAndAdd(int delta),等等。一看就知道是干什么用的,就算不知道,查一查api文档也知道了。
那么为什么要这么包装呢?因为“An int value that may be updated atomically”。这个atomically的意思就是说,可以线程安全。
如果不同的线程对同一个Atomic对象操作,那么每次只有一个线程能操作。保证线程安全。
与synchronized的区别最明显的就是,使用方便。
其次,我在网上查找到的描述来看,这个Atomic的操作实际上是通过native来实现,启用了CPU的硬件级别的同步功能。所以效率更高。
那么,在合适的情况下,应该多使用Atomic类。
ExcuterService
Handler是Android里面使用频率非常高的一个类,不管是各种组件里面的使用,还是直接使用都非常有效。但是这个是Android增加的,并不是JAVA里面的。
实际上,1.5版本的java.util.concurrent包还有这么一个ExcuterService接口,以及一些提供支持的类,提供了类似的操作。
ScheduledExcuterService service = Excuters.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
第一行创建这么一个对象,第二行就像timer一样操作。
ScheduledExcuterService是使用的线程池来实现,所以效率更好,不需要专门的维护。
java.util.concurrent
这个包下面的更多的工具还需要进一步探索。