`
逆风的香1314
  • 浏览: 1431191 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过ExecutorService实现单例的同步访问控制

阅读更多
from:http://www.java2000.net/p13007

Count是一个多线程偶数计数器,通常我们应该使用synchronized,或者Lock来保证该递增操作的原子性和可见性。本例使用了单例的ExecutorService,来保证Count的递增的原子性。

  1. import java.util.concurrent.Callable;
  2. import java.util.concurrent.ExecutionException;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. /**
  6.  * 通过ExecutorService实现单例的同步访问控制。
  7.  * 
  8.  * @author 老紫竹 JAVA世纪网(java2000.net)
  9.  * 
  10.  */
  11. public class T {
  12.   private final ExecutorService exec = Executors.newSingleThreadExecutor();
  13.   public long getCount() throws InterruptedException, ExecutionException {
  14.     return exec.submit(new Callable<Long>() {
  15.       @Override
  16.       public Long call() throws Exception {
  17.         return ++count;
  18.       }
  19.     }).get();
  20.   }
  21.   private long count;
  22.   public void add() {
  23.     exec.execute(new Runnable() {
  24.       @Override
  25.       public void run() {
  26.         count++;
  27.         System.out.println(count);
  28.       }
  29.     });
  30.   }
  31.   public static void main(String[] args) {
  32.     final T t = new T();
  33.     class TT extends Thread {
  34.       public void run() {
  35.         for (int i = 1; i <= 5; i++) {
  36.           try {
  37.             t.add();
  38.             System.out.println(t.getCount());
  39.             Thread.sleep(10);
  40.           } catch (Exception e) {
  41.             // TODO Auto-generated catch block
  42.             e.printStackTrace();
  43.           }
  44.         }
  45.       }
  46.     }
  47.     for (int i = 1; i <= 5; i++) {
  48.       new TT().start();
  49.     }
  50.   }
  51. }
运行结果
1
2
3
4
5
6
7
10
8
9
11
12
15
16
19
14
17
20
13
18
21
22
24
26
28
25
29
27
30
23
31
32
35
37
39
33
36
38
34
40
41
42
45
47
49
43
44
46
48
50


分享到:
评论

相关推荐

    设计模式 之 “单例模式[Singleton Pattern]”

    **单例模式(Singleton Pattern)**是软件设计模式中的一种基础模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接池等,这些都...

    基于Java多线程同步技术的简易模拟售票系统实现.zip

    Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`和`CountDownLatch`等,用于控制对共享资源的访问。 4. **synchronized关键字** `synchronized`关键字用于锁定...

    java线程笔记

    Java提供ExecutorService接口和ThreadPoolExecutor类来创建线程池,通过调整线程池的参数,如核心线程数、最大线程数和工作队列大小,可以优化系统的性能和资源利用率。 以上就是关于"java线程笔记"中的主要知识点...

    java多线程设计模式详解PDF及源码

    5. 线程池模式:通过ExecutorService和ThreadPoolExecutor实现,它可以有效地管理和控制线程,避免频繁创建和销毁线程带来的开销,提高系统性能。 6. 死锁预防模式:通过避免多个线程间的循环等待资源,防止死锁的...

    java多线程设计模式

    Java提供了多种同步机制,如`synchronized`关键字、`wait()`和`notify()`方法、`Lock`接口及其实现类,用于控制对共享资源的访问,避免数据不一致性和竞态条件。 7. **死锁(Deadlock)** 死锁是指两个或多个线程...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    5. 状态对象模式:用于在多线程中同步访问对象的状态,例如CountDownLatch、CyclicBarrier和Semaphore等并发工具类,它们可以帮助我们控制线程间的同步和协作。 6. 同步适配器模式:通过包装已有的线程不安全的类,...

    多核多线程下java设计模式性能提升.zip

    2. 单例模式:在多线程环境中,使用双重检查锁定(DCL)实现线程安全的单例,确保唯一实例的同时避免同步开销。 3. 生产者-消费者模式:通过BlockingQueue实现线程间的通信和协作,避免了直接线程间同步,提高了程序...

    Java面试题线程部分.docx

    1. 临界区:通过控制多线程对代码段的访问顺序。 2. 互斥对象:使用synchronized关键字实现,确保同一时刻只有一个线程访问对象。 3. 信号量:Semaphore类用于控制同时访问特定资源的线程数量。 4. 事件对象:使用...

    java高并发1

    同步机制是并发编程中的关键,Java提供了synchronized关键字来实现线程同步,确保同一时刻只有一个线程能访问临界区,同时保证了内存可见性。此外,Java还提供了更灵活的ReentrantLock,它支持公平锁和非公平锁,...

    java面试总结.doc

    Java提供了synchronized关键字进行同步,可以是同步方法或同步代码块,以及Lock接口的实现,如ReentrantLock,它提供更细粒度的控制。线程的生命周期包括新建、就绪、运行、阻塞和消亡五个阶段。 3. 单例模式 单例...

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    设计模式是解决软件设计中常见问题的模板,如单例模式确保类只有一个实例,可使用双重检查锁定实现线程安全的单例。生命周期回调方法在对象创建、使用和销毁过程中被调用,如Spring框架中的初始化和销毁方法。 Java...

    操作系统课程设计 java实现

    6. **设备管理**:虽然Java本身不直接支持硬件访问,但可以通过JNI(Java Native Interface)调用C/C++库来间接控制硬件设备,例如磁盘I/O、网络通信等。 7. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载...

    DAO多线程的技巧.rar_dao

    - **并发控制**:在需要共享DAO实例的场景下,可以使用synchronized关键字或者Lock接口(如ReentrantLock)来实现方法或代码块的互斥访问。 2. **批处理操作** - **批量插入与更新**:在多线程环境下,可以将大量...

    java实现聊天软件

    Java提供了各种同步机制,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`java.util.concurrent`包中的高级并发工具,如`Semaphore`、`ExecutorService`等,用于控制线程访问共享资源,...

    米哈游笔试题目-Java方向.docx

    在Java中,实现单例模式通常有多种方法,包括饿汉式、懒汉式(同步块)、双重检查锁定等。为了确保线程安全,这里采用双重检查锁定的方式实现。 1. **类定义**:首先定义一个名为`Logger`的类,该类包含一个私有的...

    JAVA十大经典案例.rar

    案例可能涵盖线程的创建(`Thread`类或实现`Runnable`接口)、线程同步(`synchronized`关键字、`wait()`和`notify()`方法)、线程池(`ExecutorService`)等。 4. **集合框架**:Java集合框架包括List、Set、Map等...

    javachat_java_控制服务器_

    10. **并发控制**:在多用户环境下,需要使用锁、同步块等并发控制机制来确保数据的一致性和完整性。例如,当更新在线用户列表时,需要防止并发访问导致的数据不一致。 以上是JavaChat项目中涉及的一些核心技术和...

Global site tag (gtag.js) - Google Analytics