0 0

单实例是不是单线程执行? 5

单实例是不是单线程执行?

我有个单实例类,是不是一个时间只有一个线程可以访问,可以多线程执行吗?

Java代码
 
public class Single {   
  
    private static Single instance=null;   
       
    private Single(){   
           
    }   
       
    public static  synchronized Single getInstance(){   
        if(instance==null){   
            instance=new Single();   
        }   
        return instance;   
    }   
           
    public void process(){   
        System.out.println("======================");   
    }   
}  


2008年7月29日 12:25

2个答案 按时间排序 按投票排序

0 0

你这个就是多线程环境下的单例模式,只是会造成严重的系统的性能问题。

不在多线程环境下的单例模式:
public class Singleton {  
    private static Singleton singleton = new Singleton();  //私有的本单例类的静态域  
      
    /** 
     * 私有的构造方法,阻止了用户通过此构造方法直接创建实例 
     */ 
    private Singleton(){}  
      
    public Singleton getInstance(){  
        return singleton;  
    }  



在多线程下的单例模式,楼主已经写出来,需要改进一下:

public class DoubleCheckedLocking {  
    private static DoubleCheckedLocking dcl;  
      
    private DoubleCheckedLocking(){}  
      
    private synchronized static void doSync(){  
        if(dcl == null)   
            dcl = new DoubleCheckedLocking();  
    }  
      
    public DoubleCheckedLocking getInstance(){  
        if(dcl == null)  //一重检查  
            doSync();    //同步的二重检查  
        return dcl;  
    }  

我们在检查之后(if (instance == null))再放置一些同步代码, 但是还是可能出现多个现成同时通过了检查。我们改进一下,检查之后,在同步代码中再检查一边,这样就是“双重锁定检查”模式了。它能将非必须的锁定优化掉。这里的同步检查最多发生一次。不会造成性能瓶劲。

我的博客有关于此模式的笔记:http://zhaipuhong.iteye.com/blog/214675
欢迎你来跟我一起讨论学习。

2008年8月05日 10:50
0 0

你的这个类只有getInstance()这个方法是只允许一个进程访问的,因为他有synchronized关键字修饰,而process()这个方法是可以多个进程同时访问的

2008年7月29日 12:38

相关推荐

    C#单线程与多线程实例

    本文将深入探讨C#中的单线程与多线程实例,帮助你理解它们的区别,并提供相关的实践示例。 一、单线程 单线程意味着一个应用程序只有一个执行线程。在这种情况下,程序按照预定的顺序执行任务,一次只能处理一个...

    VC单线程编程实例

    "VC单线程编程实例"是针对初学者的一个教程,旨在介绍如何在VC环境中创建和管理单线程。 线程是操作系统分配CPU时间的基本单位,每个线程都有自己的执行上下文,包括程序计数器、栈、局部变量等。在单线程程序中,...

    delphi线程简单实例

    总结来说,通过这个简单的Delphi线程实例,我们了解了如何创建自定义线程类,定义线程执行的逻辑,并在主程序中启动和管理线程。在实际开发中,可以依据需求扩展线程功能,实现更复杂的并发操作。

    Java建立一个单线程的实例.rar

    这个实例将帮助初学者理解如何在Java中创建和管理单线程。下面我们将详细讨论相关知识点。 1. **线程的生命周期**: - 新建(New):当使用`Thread`类创建一个对象时,线程处于新建状态。 - 可运行(Runnable):...

    JAVA单线程多线程

    在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型简化了程序设计,降低了程序复杂度,使得开发者可以更专注于...

    单线程与多线程的区别

    单线程和多线程是计算机程序执行时的两种不同模型,它们在处理并发任务、资源管理和性能上有着显著的差异。理解这两种模型是编程尤其是服务器端开发的基础,尤其是在Java、C#等支持多线程的编程语言中。 首先,让...

    使用单独的线程执行程序代码

    "使用单独的线程执行程序代码"这一主题涉及到并发执行任务,提高应用程序的性能和用户体验。以下将详细介绍如何在.NET中创建和管理线程,以及相关的知识点。 1. **线程介绍**:线程是操作系统分配CPU时间的基本单元...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    创建线程简单实例

    Console.WriteLine("线程执行完成"); } ``` 在上述代码中,`ThreadStart`是一个预定义的委托类型,它接受一个没有参数的方法。`MyThreadMethod`就是我们要在线程中执行的方法。`myThread.Start()`启动新创建的线程...

    Delphi 多线程实例

    `Execute` 方法是线程实际运行的地方,你在这里编写线程执行的任务代码。例如: ```delphi type TMyThread = class(TThread) private FResult: Integer; // 存储计算结果的变量 protected procedure Execute; ...

    vb 多线程 实例(thread 类创建)

    在VB(Visual Basic)编程中,多线程技术允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。本实例将详细讲解如何利用Thread类来创建和管理线程。 首先,理解线程的基本概念至关重要。线程是程序...

    JVM监控实例数 windows监控 线程测试 单例模式下测试JVM实例是否一个

    本文将探讨如何在Windows环境下通过简单的命令行工具来监控JVM实例的数量,以及如何进行线程测试,特别是在单例模式下的JVM实例验证。 首先,了解如何监控JVM实例数量。在Windows操作系统中,我们可以使用`jps`命令...

    java线程实例 各种小Demo

    - Executors.newSingleThreadExecutor():创建单线程的线程池,所有任务都在唯一的工作线程中按顺序执行。 - Executors.newCachedThreadPool():创建可缓存的线程池,线程数量根据任务动态调整,空闲超过60秒的线程...

    实例分析Java单线程与多线程

    实例分析Java单线程与多线程 在 Java 中,线程是程序执行的基本单元,每个任务称为一个线程,线程不能独立存在,它必须是进程的一部分。根据线程的数量,Java 程序可以分为单线程和多线程两种。 单线程是最常见的 ...

    多线程实例,线程实例

    在计算机编程领域,多线程是一种并发执行任务的技术,它允许多个任务或子任务同时在单个程序中运行。这种技术尤其在处理CPU密集型和I/O密集型任务时,能够显著提升程序的效率和响应速度。在本文中,我们将深入探讨多...

    C#多线程编程实例实战

    此外,`Thread.Join()`方法用于等待一个线程结束,`Thread.Sleep()`可以用来让当前线程暂停一段时间,而`Thread.IsAlive`属性则用于检查线程是否还在运行。在实例中,这些方法可能会被用到来控制线程的生命周期和...

    JAVA100例之实例60 继承Thread实现多线程

    在单线程环境中,程序按顺序执行;而在多线程环境中,多个线程可以共享同一块内存空间,从而实现并行处理。 **继承Thread类创建线程的步骤:** 1. **创建子类**:创建一个类,该类继承自`java.lang.Thread`类。 2....

    多个实例同时运行 多实例编程 多线程 vc 源码

    1. **主程序入口**:在主函数(main或WinMain)中,判断是否已经存在其他实例,如果不存在则创建新实例,如果存在则可能将消息发送回第一个实例,避免重复打开。 2. **线程创建**:在代码中,可能会有如下的代码段...

    多线程-VB.net开发实例_vb.net多线程_

    在单线程环境下,程序按顺序执行;而在多线程环境下,多个线程可以同时执行不同的任务,提高了程序的并行处理能力。 2. **VB.NET中的多线程支持**:VB.NET提供了`System.Threading`命名空间,其中包含了用于创建和...

    易语言-json解析的单线程与多线程操作实例

    总的来说,通过分析这个"易语言-json解析的单线程与多线程操作实例",我们可以学习到如何在易语言环境下进行JSON解析,并了解如何利用多线程提升程序执行效率。此外,还可以深入研究线程同步技术,进一步优化多线程...

Global site tag (gtag.js) - Google Analytics