`
linliangyi2007
  • 浏览: 1003570 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

发布 IK Analyzer 2012 版本

阅读更多
新版本改进:
  • 支持分词歧义处理
  • 支持数量词合并
  • 词典支持中英文混合词语,如:Hold住



IK Analyzer 2012特性
  • 采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式;
  • 在系统环境:Core2 i7 3.4G双核,4G内存,window 7 64位, Sun JDK 1.6_29 64位 普通pc环境测试,IK2012具有160万字/秒(3000KB/S)的高速处理能力。
  • 2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。
  • 采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
  • 优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。



分词效果示例
IK Analyzer 2012版本支持 细粒度切分 和 智能切分,以下是两种切分方式的演示样例。

文本原文1:
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本。

智能分词结果:
ikanalyzer | 是 | 一个 | 开源 | 的 | 基于 | java | 语言 | 开发 | 的 | 轻量级 | 的 | 中文 | 分词 | 工具包 | 从 | 2006年 | 12月 | 推出 | 1.0版 | 开始 | ikanalyzer | 已经 | 推 | 出了 | 3个 | 大 | 版本

最细粒度分词结果:
ikanalyzer | 是 | 一个 | 一 | 个 | 开源 | 的 | 基于 | java | 语言 | 开发 | 的 | 轻量级 | 量级 | 的 | 中文 | 分词 | 工具包 | 工具 | 包 | 从 | 2006 | 年 | 12 | 月 | 推出 | 1.0 | 版 | 开始 | ikanalyzer | 已经 | 推出 | 出了 | 3 | 个 | 大 | 版本

文本原文2:
张三说的确实在理

智能分词结果:
张三 | 说的 | 确实 | 在理

最细粒度分词结果:
张三 | 三 | 说的 | 的确 | 的 | 确实 | 实在 | 在理

文本原文3
公路局正在治理解放大道路面积水问题

智能分词结果:
公路局 | 正在 | 治理 | 解放 | 大道 | 路面 | 积水 | 问题

最细粒度分词结果:
公路局 | 公路 | 路局 | 正在 | 治理 | 理解 | 解放 | 放大 | 大道 | 道路 | 路面 | 面积 | 积水 | 问题

文本原文4
据路透社报道,印度尼西亚社会事务部一官员星期二(29日)表示,日惹市附近当地时间27日晨5时53分发生的里氏6.2级地震已经造成至少5427人死亡,20000余人受伤,近20万人无家可归。

智能分词结果:
据 | 路透社 | 报道 | 印度尼西亚 | 社会 | 事务部 | 一 | 官员 | 星期二 | 29日 | 表示 | 日 | 惹 | 市 | 附近 | 当地时间 | 27日 | 晨 | 5时 | 53分 | 发生 | 的 | 里氏 | 6.2级 | 地震 | 已经 | 造成 | 至少 | 5427人 | 死亡 | 20000 | 余人 | 受伤 | 近 | 20 | 万人 | 无家可归

最细粒度分词结果:
据 | 路透社 | 路透 | 社 | 报道 | 印度尼西亚 | 印度 | 尼 | 西亚 | 社会事务 | 社会 | 事务部 | 事务 | 部 | 一 | 官员 | 星期二 | 星期 | 二 | 29 | 日 | 表示 | 日 | 惹 | 市 | 附近 | 当地时间 | 当地 | 时间 | 27 | 日 | 晨 | 5 | 时 | 53 | 分发 | 分 | 发生 | 发 | 生 | 的 | 里氏 | 6.2 | 级 | 地震 | 已经 | 造成 | 至少 | 5427 | 人 | 死亡 | 20000 | 余人 | 受伤 | 近 | 20 | 万人 | 万 | 人 | 无家可归


GoogleCode下载:
http://code.google.com/p/ik-analyzer/downloads/list

分享到:
评论
99 楼 thewayuare 2014-07-02  
xiaolong_0702 写道
敬爱的楼主您好;
以前用的 lucene-core-3.4.0.jar和IKAnalyzer3.2.8.jar
现在升级到Lucene4.7.1.jar 和分词器的 IKAnalyzer2012_u6.jar时
报出异常
Caused by: java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStream.
(Ljava/lang/String;Ljava/io/Reader;)Lorg/apache/lucene/analysis/TokenStream;

是什么问题 怎么解决 急待求解。谢谢啦

98 楼 xiaolong_0702 2014-04-04  
敬爱的楼主您好;
以前用的 lucene-core-3.4.0.jar和IKAnalyzer3.2.8.jar
现在升级到Lucene4.7.1.jar 和分词器的 IKAnalyzer2012_u6.jar时
报出异常
Caused by: java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides final method tokenStream.
(Ljava/lang/String;Ljava/io/Reader;)Lorg/apache/lucene/analysis/TokenStream;

是什么问题 怎么解决 急待求解。谢谢啦
97 楼 sendreams 2014-01-13  
flhs2011 写道
林兄,我现在遇到一个关于最大词长切分的问题,我使用的是hibernate search,IKAnalyzer是通过
@Analyzer(impl = IKAnalyzer.class)
方式注入进去的,我现在想按照最大词长切分,IKAnalyzer的默认构造函数是最细粒度,我现在不知道如何配置最大词长切分,请告知,谢谢!

我不是作者,不过你说的这个修改配置文件即可。
IKAnalyzer.cfg.xml
96 楼 chris开到荼縻 2013-08-10  
博主,我刚接触IKAnalyzer,有些很基本的问题想向您请教。
首先,我在个人扩展字典里面存的有锦绣龙城,可是为什么检索后分词的结果还是锦绣,龙城?
其次,我对个人扩展字典进行编辑后,分词结果没有及时的改变是怎么回事?
最后,如果IKAnalyzer的主字典表里面有锦绣,龙城,我的扩展字典里已经存了锦绣龙城,分词结果如何使扩展字典的锦绣龙城?
谢谢博主了
95 楼 flhs2011 2013-06-19  
林兄,我现在遇到一个关于最大词长切分的问题,我使用的是hibernate search,IKAnalyzer是通过
@Analyzer(impl = IKAnalyzer.class)
方式注入进去的,我现在想按照最大词长切分,IKAnalyzer的默认构造函数是最细粒度,我现在不知道如何配置最大词长切分,请告知,谢谢!
94 楼 linliangyi2007 2013-02-15  
dillon1986 写道
我也是这样使用的
实现Configuration(),默认仍然使用DefaultConfig里的内容,除了扩展词库和扩展停用词库,然后为Dictionary添加了扩展词和扩展停用词
Dictionary dictionary = new Dictionary(Configuration)
dictionary.addWords();
dictionary.disableWords();
但是之后使用 IkSegmenter ikSegmenter = new IkSegmenter(text,true)
能分出扩展词,但是不能去停用词
是不是我的用法不对

lxxvzna 写道
你好:
     我下载的是IKAnalyzer2012_u6。请问一下,如何扩展词库。
帮忙看下,我的工程对吗
package com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.wltea.analyzer.cfg.Configuration;
import org.wltea.analyzer.dic.Dictionary;

public class StrengthenedIK {
	
	private static Dictionary d;
	private List<String> ws = new ArrayList<String>();
	
	public StrengthenedIK(){
		d = Dictionary.initial(new Configuration(){

			@Override
			public List<String> getExtDictionarys() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public List<String> getExtStopWordDictionarys() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public String getMainDictionary() {
				// TODO Auto-generated method stub
				return "gw.txt";
			}

			@Override
			public String getQuantifierDicionary() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public void setUseSmart(boolean arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public boolean useSmart() {
				// TODO Auto-generated method stub
				return false;
			}
			
		});
	}
	
	public void AddWords(String fn){
		readFileByLines(fn);
		d.addWords(ws);
	}
	
	public void readFileByLines(String fileName) {
        File file = new File(fileName);
        BufferedReader reader = null;
        try {        
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;                       
            while ((tempString = reader.readLine()) != null) {
            	ws.add(tempString);                            
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		StrengthenedIK ik = new StrengthenedIK();
		ik.AddWords("sougou8.txt");
		System.out.println("ok");
	}

}




天哪!!!你们那里看的说disableWords是用来添加停止词的啊,这个方法是用来删除词典内的词的,跟停止词没关系!
93 楼 dillon1986 2013-02-01  
我也是这样使用的
实现Configuration(),默认仍然使用DefaultConfig里的内容,除了扩展词库和扩展停用词库,然后为Dictionary添加了扩展词和扩展停用词
Dictionary dictionary = new Dictionary(Configuration)
dictionary.addWords();
dictionary.disableWords();
但是之后使用 IkSegmenter ikSegmenter = new IkSegmenter(text,true)
能分出扩展词,但是不能去停用词
是不是我的用法不对

lxxvzna 写道
你好:
     我下载的是IKAnalyzer2012_u6。请问一下,如何扩展词库。
帮忙看下,我的工程对吗
package com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.wltea.analyzer.cfg.Configuration;
import org.wltea.analyzer.dic.Dictionary;

public class StrengthenedIK {
	
	private static Dictionary d;
	private List<String> ws = new ArrayList<String>();
	
	public StrengthenedIK(){
		d = Dictionary.initial(new Configuration(){

			@Override
			public List<String> getExtDictionarys() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public List<String> getExtStopWordDictionarys() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public String getMainDictionary() {
				// TODO Auto-generated method stub
				return "gw.txt";
			}

			@Override
			public String getQuantifierDicionary() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public void setUseSmart(boolean arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public boolean useSmart() {
				// TODO Auto-generated method stub
				return false;
			}
			
		});
	}
	
	public void AddWords(String fn){
		readFileByLines(fn);
		d.addWords(ws);
	}
	
	public void readFileByLines(String fileName) {
        File file = new File(fileName);
        BufferedReader reader = null;
        try {        
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;                       
            while ((tempString = reader.readLine()) != null) {
            	ws.add(tempString);                            
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		StrengthenedIK ik = new StrengthenedIK();
		ik.AddWords("sougou8.txt");
		System.out.println("ok");
	}

}

92 楼 nina_gucas 2013-01-22  
楼主你好,最近在使用IK分词器,有一个问题请教:

当我的输入字符串是阿拉伯汉字和大写汉字的数字连在一起的时候,例如“9十二”,使用IK分词会报出java.lang.NullPointerException的异常,以下是我的代码:

String text = "9十二";
		
		StringReader reader = new StringReader(text);
		IKSegmenter ikSeg = new IKSegmenter(reader, true);

		Lexeme lex = null;  
        while((lex = ikSeg.next()) != null){  
            System.out.print(lex.getLexemeText()+" ");  
        }  

		reader.close();


请问是我调用的问题,还是IK分词器的bug,谢谢!
91 楼 linliangyi2007 2012-12-26  
lxxvzna 写道
你好:
     我下载的是IKAnalyzer2012_u6。请问一下,如何扩展词库。
帮忙看下,我的工程对吗


看了你的设计思路应该没问题。目前出现什么状况了吗?
90 楼 lxxvzna 2012-12-25  
你好:
     我下载的是IKAnalyzer2012_u6。请问一下,如何扩展词库。
帮忙看下,我的工程对吗
package com;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.wltea.analyzer.cfg.Configuration;
import org.wltea.analyzer.dic.Dictionary;

public class StrengthenedIK {
	
	private static Dictionary d;
	private List<String> ws = new ArrayList<String>();
	
	public StrengthenedIK(){
		d = Dictionary.initial(new Configuration(){

			@Override
			public List<String> getExtDictionarys() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public List<String> getExtStopWordDictionarys() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public String getMainDictionary() {
				// TODO Auto-generated method stub
				return "gw.txt";
			}

			@Override
			public String getQuantifierDicionary() {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public void setUseSmart(boolean arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public boolean useSmart() {
				// TODO Auto-generated method stub
				return false;
			}
			
		});
	}
	
	public void AddWords(String fn){
		readFileByLines(fn);
		d.addWords(ws);
	}
	
	public void readFileByLines(String fileName) {
        File file = new File(fileName);
        BufferedReader reader = null;
        try {        
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;                       
            while ((tempString = reader.readLine()) != null) {
            	ws.add(tempString);                            
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		StrengthenedIK ik = new StrengthenedIK();
		ik.AddWords("sougou8.txt");
		System.out.println("ok");
	}

}
89 楼 linliangyi2007 2012-12-11  
wj3764 写道
请问楼主,配置停用词和扩展词的时候,能不能改变配置文件IKAnalyzer.cfg.xml的路径呢?比如,原来放在根目录下(web-inf/classes), 想放在configuration/lucene中, 应该怎么做呢?


目前IK没有采用目录搜索优先级方式来定义配置文件,所以,如果一定要修改,只能修改源码了!!

后期考虑加上这个功能
88 楼 wj3764 2012-12-11  
请问楼主,配置停用词和扩展词的时候,能不能改变配置文件IKAnalyzer.cfg.xml的路径呢?比如,原来放在根目录下(web-inf/classes), 想放在configuration/lucene中, 应该怎么做呢?
87 楼 czhcc 2012-11-20  
请问2012 U6版的源版有没有下载的?
86 楼 linliangyi2007 2012-11-08  
gf010010 写道
请问IKAnalyzer有没有处理同义词、近义词相关的模块,若有请问如何配置。



目前没有提供同义词近义词功能
85 楼 linliangyi2007 2012-11-08  
sabrina_joshua 写道
最近作业中需要使用分词工具,选择了 IKAnalyzer,使用的是2012版本。

错误信息如下:
12/10/06 21:09:20 INFO mapred.JobClient: Task Id : attempt_201210052358_0005_m_000000_1, Status : FAILED
java.lang.ArrayIndexOutOfBoundsException: 3072
	at org.wltea.analyzer.core.AnalyzeContext.moveCursor(AnalyzeContext.java:159)
	at org.wltea.analyzer.core.IKSegmenter.next(IKSegmenter.java:142)
	at com.sabrina.util.WordAnalyzerUtil.analyze(WordAnalyzerUtil.java:112)
	at com.sabrina.mapreduce.WebsiteAnalyzer$WebsiteAnalyzerMapper.map(WebsiteAnalyzer.java:82)
	at com.sabrina.mapreduce.WebsiteAnalyzer$WebsiteAnalyzerMapper.map(WebsiteAnalyzer.java:1)
	at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
	at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:416)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
	at org.apache.hadoop.mapred.Child.main(Child.java:249)



对应代码:
/*
	 *  分词主功能
	 *  
	 *  当待分词的内容有效时,返回ArrayList<LexemeInfo>类型结果;
	 *  否则,返回null.
	 */
	public ArrayList<LexemeInfo> analyze() {
		
		if(titleContent == null || titleContent == "") 
			return null;
		
		Reader reader = new StringReader(titleContent);
		
		// 配置管理类
		Configuration conf = new Configuration();
		conf.setUseSmart(true);	// 智能切分策略
		
		
		IKSegmenter segmenter = new IKSegmenter(reader, conf); // IK分词器(与Lucence无关)
		
		if (segmenter == null)
			return null;
		
		try {
			Lexeme word = segmenter.next();	// 获取下一个词元
			int beginPosition = -1; // 词元在字符串中的偏移量 
			String text = null;     // 词元内容
			int type = -1;			// 词元类型
			
			ArrayList<LexemeInfo> lexemeList = new ArrayList<LexemeInfo>();
			
			
			while(word != null) { // 判断是否还有未读的词元
				LexemeInfo lexeme = new LexemeInfo();
				
				beginPosition = word.getBeginPosition();
				text = word.getLexemeText();
				type = word.getLexemeType();
				

				lexeme.setWord(text);
				lexeme.setPosition(beginPosition);
				
				lexemeList.add(lexeme);
				
				word = segmenter.next(); // 顺次读取字符串中的词元
			}
			
			return lexemeList;
			
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}


请问下,可能会是什么原因引起的?。。


从您的错误信息上看,你使用的不是2012的最新版本,建议下载2012 U6版本,该bug应该已经修复,谢谢
84 楼 gf010010 2012-11-06  
请问IKAnalyzer有没有处理同义词、近义词相关的模块,若有请问如何配置。
83 楼 sabrina_joshua 2012-10-06  
最近作业中需要使用分词工具,选择了 IKAnalyzer,使用的是2012版本。

错误信息如下:
12/10/06 21:09:20 INFO mapred.JobClient: Task Id : attempt_201210052358_0005_m_000000_1, Status : FAILED
java.lang.ArrayIndexOutOfBoundsException: 3072
	at org.wltea.analyzer.core.AnalyzeContext.moveCursor(AnalyzeContext.java:159)
	at org.wltea.analyzer.core.IKSegmenter.next(IKSegmenter.java:142)
	at com.sabrina.util.WordAnalyzerUtil.analyze(WordAnalyzerUtil.java:112)
	at com.sabrina.mapreduce.WebsiteAnalyzer$WebsiteAnalyzerMapper.map(WebsiteAnalyzer.java:82)
	at com.sabrina.mapreduce.WebsiteAnalyzer$WebsiteAnalyzerMapper.map(WebsiteAnalyzer.java:1)
	at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
	at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:416)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
	at org.apache.hadoop.mapred.Child.main(Child.java:249)



对应代码:
/*
	 *  分词主功能
	 *  
	 *  当待分词的内容有效时,返回ArrayList<LexemeInfo>类型结果;
	 *  否则,返回null.
	 */
	public ArrayList<LexemeInfo> analyze() {
		
		if(titleContent == null || titleContent == "") 
			return null;
		
		Reader reader = new StringReader(titleContent);
		
		// 配置管理类
		Configuration conf = new Configuration();
		conf.setUseSmart(true);	// 智能切分策略
		
		
		IKSegmenter segmenter = new IKSegmenter(reader, conf); // IK分词器(与Lucence无关)
		
		if (segmenter == null)
			return null;
		
		try {
			Lexeme word = segmenter.next();	// 获取下一个词元
			int beginPosition = -1; // 词元在字符串中的偏移量 
			String text = null;     // 词元内容
			int type = -1;			// 词元类型
			
			ArrayList<LexemeInfo> lexemeList = new ArrayList<LexemeInfo>();
			
			
			while(word != null) { // 判断是否还有未读的词元
				LexemeInfo lexeme = new LexemeInfo();
				
				beginPosition = word.getBeginPosition();
				text = word.getLexemeText();
				type = word.getLexemeType();
				

				lexeme.setWord(text);
				lexeme.setPosition(beginPosition);
				
				lexemeList.add(lexeme);
				
				word = segmenter.next(); // 顺次读取字符串中的词元
			}
			
			return lexemeList;
			
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}


请问下,可能会是什么原因引起的?。。
82 楼 linliangyi2007 2012-09-28  
“将来你和我是怎么的关系”
yrclsgo 写道
[quote="linliangyi2007"
“将来你和我是怎么的关系”
为什么会把“和我”做一个词呢?


词典中确实存在部分垃圾词,可以将其删除
81 楼 yrclsgo 2012-09-27  
[quote="linliangyi2007"
“将来你和我是怎么的关系”
为什么会把“和我”做一个词呢?
80 楼 nickycheng 2012-09-07  
linliangyi2007 写道
XinYiTian 写道
博主,程序中几个单例的地方用到了double lock check,例如:
public static Dictionary initial(Configuration cfg){
if(singleton == null){
synchronized(Dictionary.class){
if(singleton == null){
singleton = new Dictionary(cfg);
return singleton;
}
}
}
return singleton;
}
private DictSegment[] getChildrenArray(){
if(this.childrenArray == null){
synchronized(this){
if(this.childrenArray == null){
this.childrenArray = new DictSegment[ARRAY_LENGTH_LIMIT];
}
}
}
return this.childrenArray;
}
private Map<Character , DictSegment> getChildrenMap(){
if(this.childrenMap == null){
synchronized(this){
if(this.childrenMap == null){
this.childrenMap = new HashMap<Character , DictSegment>(ARRAY_LENGTH_LIMIT * 2,0.8f);
}
}
}
return this.childrenMap;
}
double lock check已经被证实在java中是错误的做法,希望楼主修正,详情可以google: java double lock check



double check lock的问题很早之前已经解决了,问题产生的原因是对象的初始化是在主内存中完成,即堆内存,而编译器对代码进行优化,导致未完全初始化的对象引用被其他线程获取到。
在2001年,JVM1.2已经发布好久了.JMM(Java Memory Model)已经已经发布了新的规范,分配空间,初始化,调用构造方法只会在线程的工作存储区完成,在没有向主存储区复制赋值时,其它线程绝对不可能见到这个过程.而这个字段复制到主存区的过程,更不会有分配空间后没有初始化或没有调用构造方法的可能.在JAVA中,一切都是按引用的值复制的.向主存储区同步其实就是把线程工作存储区的这个已经构造好的对象有压缩堆地址值COPY给主存储区的那个变量.这个过程对于其它线程,要么是resource为 null,要么是完整的对象.绝对不会把一个已经分配空间却没有构造好的对象让其它线程可见.



http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
我看这上面说的是jdk5以后对于单例对象使用volatile关键字可以保证DCL不出问题,或者单例对象本身所有属性都是final的。
不知博主有什么解释没?

相关推荐

Global site tag (gtag.js) - Google Analytics