原
jvm中堆栈的数据共享和线程共享
先来分析数据共享:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况,即共享了3这个栈数据。
对于String类型来说,编译期已经创建好的(String a="123" ,双引号定义的内容)存在常量池里面,如果是运行期则存在堆中(String b=new String("123"),new 出来的对象),而等号的左边为引用对象。
对于栈和常量池中的数据可以共享,即可以有多个引用对象;而对于堆来说,数据不可以共享,只能有一个引用对象。
再来分析线程共享:
所有线程共享堆,但每个线程都有自己的寄存器和自己的栈。
所有线程占有的都是不共享的:栈、寄存器、PC。
线程共享的有:堆、全局变量、静态变量、方法区。
<script>
(function(){
function setArticleH(btnReadmore,posi){
var winH = $(window).height();
var articleBox = $("div.article_content");
var artH = articleBox.height();
if(artH > winH*posi){
articleBox.css({
'height':winH*posi+'px',
'overflow':'hidden'
})
btnReadmore.click(function(){
if(typeof window.localStorage === "object" && typeof window.csdn.anonymousUserLimit === "object"){
if(!window.csdn.anonymousUserLimit.judgment()){
window.csdn.anonymousUserLimit.Jumplogin();
return false;
}else if(!currentUserName){
window.csdn.anonymousUserLimit.updata();
}
}
articleBox.removeAttr("style");
$(this).parent().remove();
})
}else{
btnReadmore.parent().remove();
}
}
var btnReadmore = $("#btn-readmore");
if(btnReadmore.length>0){
if(currentUserName){
setArticleH(btnReadmore,3);
}else{
setArticleH(btnReadmore,1.2);
}
}
})()
</script>
</article>