java 共享内存变量问题

ilrxx 2010-12-28 02:26:34
我现在想做个类似于负载均衡轮询,目前只需要rr 轮叫(Round Robin)这种最简单的方式,即什么都不用管,1显示完了,下次访问显示2,再显示3,都显示完了,再轮回到1,于是我做了下面一个小例子,我知道我需要一个东西来保存我上次访问的位置,就叫访问位置因子吧,我不需要文件或者数据库这种额外的存储介质,我只要放到内存中。
问题来了,下面的例子始终会打印1,而不是1,2,1,2.....,这是因为每次又把i重新设置为了-1,我想知道我怎样存储这个访问位置因子(i),比如我访问过0位置,那么下次访问i是从0开始的,而不是-1,谢谢


public static Integer i ;

static{
i = -1;
}

public static void main(String[] args) {
Vector<Integer> v = new Vector<Integer>();
v.add(1);
v.add(2);
i = (i +1)%v.size();
System.out.println(v.get(i));
i ++;
if(i >= v.size())
i = -1;
}


...全文
235 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilrxx 2010-12-28
  • 打赏
  • 举报
回复
有解啊。。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%!
private static int index = -1;
%><%
Vector<Integer> v = new Vector<Integer>();
v.add(1);
v.add(2);
out.println(v.get(++index));
if(index >= v.size()-1)
index = -1;
%>

你放到resin或者tomcat中看看,是不是1,2,1,2。。。静态变量共享内存空间
weijggmail 2010-12-28
  • 打赏
  • 举报
回复
如你所述的方法,无解。
首先:自己监视自己因子,如同自己的眼睛要去看自己的眼睛(我不想借助任何第三方媒介)无解。

其次:思路
1.利用文件存储媒介,这是静态监测最通用的做法。
2.利用监测系统监测(另外应用程序),这是动态监测的通用做法。
ilrxx 2010-12-28
  • 打赏
  • 举报
回复
谢谢大家,我太白痴了,我把这个代码放到了一个jsp,用tomcat去加载,static变量被容器加载初始化一次就不会再初始化了,这样就相当于模拟了多线程去访问共享变量了,切忌以后不要在main函数去测试这种逻辑。
zdjray 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ilrxx 的回复:]

我貌似知道了,其实原理很简单,这个东西放到一个静态变量中保存就行,但是我模拟的方式不对吧,我是不是应该用多线程去模拟,而不是每次都跑一个main函数
[/Quote]

恩,这才是问题所在
你每次都用main跑,当然结果一样

开多线程就不一样了,试试吧
ousyuryu 2010-12-28
  • 打赏
  • 举报
回复
逻辑上有问题
i = (i +1)%v.size();
为什么还要给i付值呢?
这样弄i不是逐一递增了。所以你把取第二个元素的case给过滤掉了

第一次
i = -1
i = (i +1)%v.size();后
i=0
取向量值后 i++
i = 1

第二次
i = 1
i = (i +1)%v.size();后
i=0
取向量值后 i++
i = 1

如此,始终get(0);
ilrxx 2010-12-28
  • 打赏
  • 举报
回复
我貌似知道了,其实原理很简单,这个东西放到一个静态变量中保存就行,但是我模拟的方式不对吧,我是不是应该用多线程去模拟,而不是每次都跑一个main函数
ilrxx 2010-12-28
  • 打赏
  • 举报
回复
楼上的,这样访问,每次都是1,因为每次都把index=0了,这是不是不能在一个class里面去调用,有人知道apache处理负载均衡的源码吗?
keeya0416 2010-12-28
  • 打赏
  • 举报
回复
大概理解了楼主的需求
不知这样可否

private static int index = 0;

public static void main(String[] args) {
Vector<Integer> v = new Vector<Integer>();
v.add(1);
v.add(2);
System.out.println(v.get(index++));
if(index >= v.size())
index = 0;
}
zdjray 2010-12-28
  • 打赏
  • 举报
回复
不明白你例子的运行方式
假如不存储,这种比较确定的值就好像1+1总是等于2一样
wsleox 2010-12-28
  • 打赏
  • 举报
回复
首先看不懂你的意图,第二如果单纯几个位置难道不是i吗?
keeya0416 2010-12-28
  • 打赏
  • 举报
回复
上边那个再给加个锁应该就可以了吧
keeya0416 2010-12-28
  • 打赏
  • 举报
回复

class Number{

private static int number = 1;

public static int getNumber(){
if(number > 2) number >>= 1;
return number++;
}

}
这个貌似可以得到你要求的 12121212...
ilrxx 2010-12-28
  • 打赏
  • 举报
回复
我是想轮询显示vector中的元素,比如第一次访问显示第一个,下次访问显示第二个,显示到最后一个时候,再访问就显示第一个。vertor线程安全
keeya0416 2010-12-28
  • 打赏
  • 举报
回复
感觉不是太明白楼上的意思
只是需要一个变量而已 为什么连Vector 都弄出了呢
ilrxx 2010-12-28
  • 打赏
  • 举报
回复
有人能告诉我吗?关于这个问题我好像忘记了一个最基础的东西,谁提醒我下。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧