扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1 共享内存对应应用开手烂发的意义
创新互联公司-专业网站定制、快速模板网站建设、高性价比中江网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式中江网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖中江地区。费用合理售后完善,十余年实体公司更值得信赖。
对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess
Communication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均有独到的优点。
对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两液镇种,而对应 Windows,实际上只有映像文件共享内存一种。所以java应用中也是只能创建映像文件共享内存。
在java语言中,基本上没有提及共享内存这个概念,但是,在某一些应用中,共享内存确实非常有用,例如采用java语言的分布式应用系统中,存在着大量的分布式共享对象,很多时候需要查询这些对象的状态,以查看系统是否运行正常或者了解这些对象的目前的一些统计数据和状态。如果采用网络通信的方式,显然会增加应用的额外负担,也增加了一些不必要的应用编程。而闹薯粗如果采用共享内存的方式,则可以直接通过共享内存查看对象的状态数据和统计数据,从而减少了一些不必要的麻烦。
多个进程哦,你确定不是多线程,多线程的话缓存类可以解决,多进程的话你橘胡物可以试试将数据存储在共做亏享文件中,例如txt,excel,xml文件中,这些规则怎么存圆液代表什么意思可以自己定,进程间通讯可能就麻烦点了
线程安全的单例模式实现有几种思路,个人认为第2种方案最优雅:、饿汉式、借助内部类、普通加锁解决、双重检测,但要注意写法,如果单体模式继续扩展为N元单体模式,那就是对象池模式了
1、饿汉式单例
复制代码
代码如下:
public class Singleton {
private
final static Singleton INSTANCE = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
return INSTANCE;
}
}
2、借助内部类
属于懒汉式单例,因为Java机制规定,内部类SingletonHolder只有在getInstance()方伏旅法第一次调用的时候才会被加载(实现了lazy),而且其加载过程是线程安全的。内部类加载的时候实例化一次instance。
复制代码
代码如下:
public class Singleton {
private
Singleton() { }
private static class SingletonHolder {
private final static
Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return
SingletonHolder.INSTANCE;
}
}
3、普通加锁解决
复制代码
代码如下:
public class Singleton {
private
static Singleton instance = null;
private Singleton() { }
public static synchronized Singleton
getInstance() {
if(instance == null) {
instance = new
Singleton();
}
return instance;
}
}
虽然解决了线程安全问题,但是每个线程调用getInstance都要加锁,我们想要只在第一次调用getInstance时加锁,请看下面的双重检测方案
4、双重检测,但要注意写法
复制代码
代码如下:
public class Singleton {
private
static Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if(instance == null)
{
synchronzied(Singleton.class) {
Singleton temp =
instance;
if(temp == null) {
temp = new
Singleton();
instance = temp
}
}
}
return instance;
}
}
由于指令重排序问题,所以不可以直接写成下面这样:
public class Singleton {
private static
Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if(instance == null)
{
synchronzied(Singleton.class) {
if(instance ==
null) {
instance = new Singleton();
}
}
}
return instance;
}
}
但是缺森凳如果春山instance实例变量用volatile修饰就可以了,volatile修饰的话就可以确保instance = new
Singleton();对应的指令不会重排序,如下的单例代码也是线程安全的:
public class Singleton {
private
static volatile Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if(instance == null)
{
synchronzied(Singleton.class) {
if(instance ==
null) {
instance = new Singleton();
}
}
}
return instance;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流