单实例模式的问题 界面使用单实例模式 画一个界面。然后其它类给它上面的组件赋值,每次访问单实例模式只要涉及到 Singleton.getInstance().xxx 操作的时候程序就停滞,不是停止,也不知道为什么。也不饱错误或者异常?大家给个意见阿?用了好多方法,也问了朋友,没搞定呢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Singleton.getInstance().xxx 把你的单例实现方式贴一下,如果自己访问应该不是死锁,你单例设计的有问题吧。 看你描述的,分析一下,原因可能有二:一、你使用的是懒汉式单例模式。每次初次访问因为要进行一些实例变量的初始化所以停滞一下。二、问题不是在单例模式上边。比如,i/o 操作,http 链接等等。 Singleton.getInstance()里面干吗了?你的单例有问题。 package pic;import java.util.TimerTask;import org.eclipse.swt.*;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.widgets.*;public class SingletonGUI { private static final SingletonGUI instance = new SingletonGUI(); public static SingletonGUI getInstance() { return instance; } private TimerTask task = new DistributeFile(); private DoDistribute pt = new DoDistribute(task); public Text txtSFileSum; /** * @wbp.parser.entryPoint */ private SingletonGUI() { final Display display = Display.getDefault(); final Shell shlG = new Shell(display, SWT.MIN | SWT.CLOSE); shlG.setSize(500, 210); shlG.setText("Show Information"); final Group groups = new Group(shlG, SWT.NONE); groups.setText("Input"); groups.setBounds(40, 20, 420, 72); Label label_1 = new Label(groups, SWT.NONE); label_1.setBounds(66, 37, 54, 12); label_1.setText("sum"); txtSFileSum = new Text(groups, SWT.BORDER); txtSFileSum.setEditable(false); txtSFileSum.setBounds(126, 32, 157, 18); txtSFileSum.setText(""); Button btnStart = new Button(shlG, SWT.NONE); btnStart.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { System.exit(0); } }); btnStart.setToolTipText(""); btnStart.setBounds(116, 125, 72, 22); btnStart.setText("start"); // 定时器事件 pt.start(1, 6); shlG.open(); shlG.layout(); while (!shlG.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } public static void main(String[] args) throws Exception { // new SingletonGUITest(); }}package pic;import java.util.TimerTask;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Text;public class DistributeFile extends TimerTask { public DistributeFile() { } public void run() { //这只是测试代码,每次走过 Come in ,就停住了,不知道为什么。 System.out.println("come in"); SingletonGUI.getInstance().txtSFileSum.setText("hello");//这个位置有问题? System.out.println("out"); }}package pic;import java.util.TimerTask;import java.util.Timer;public class DoDistribute { private Timer timer; private TimerTask task; public DoDistribute(TimerTask task) { this.timer = new Timer(); this.task = task; } public void start(int delay, int internal) { timer.schedule(task, delay * 1000, internal * 1000); }}大家帮忙看看,怎么处理啊。 private static final SingletonGUI instance = new SingletonGUI(); public static SingletonGUI getInstance() { return instance; } 我觉得可以考虑把这一块改改private static final SingletonGUI instance =null;public static synchronized SingletonGUI getInstance() { if(null==instance){instance=new SingletonGUI();}else{return instance; }} 因为单实例模式对象构造函数,死循环造成死锁。目前解决。 private Display display; private Shell shlG; private SingletonGUI() {画面部分代码 略 } private void run() { // 启动定时器事件 pt.start(1, 6); shlG.open(); shlG.layout(); while (!shlG.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } public static void main(String[] args) throws Exception { SingletonGUI sg = SingletonGUI.getInstance(); sg.run(); } 网上预订飞机票系统(java) 高分 求助:现在拿到了移动工作流引擎接入说明书,老大要我整一个我们系统接入的文档 SSH annotation HibernateSearch 怎样执行多条件联合查询 , 高手接招 有人对jfreechart比较熟悉吗,帮帮忙 继承在hibernate中的实现,如何用criteria检索每个子类里相同的字段? 如何输入http://localhost/ 就转进入我的工程 TOMCAT 初学axis,请教高手个问题? tomcat启动出错 请问j2ee规范中事务处理允许嵌套吗? 如何用重定向的方式访问WEB-INF文件夹下的JSP页面? spring事物回滚
把你的单例实现方式贴一下,如果自己访问应该不是死锁,你单例设计的有问题吧。
一、你使用的是懒汉式单例模式。每次初次访问因为要进行一些实例变量的初始化所以停滞一下。
二、问题不是在单例模式上边。比如,i/o 操作,http 链接等等。
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.*;public class SingletonGUI { private static final SingletonGUI instance = new SingletonGUI(); public static SingletonGUI getInstance() {
return instance;
} private TimerTask task = new DistributeFile();
private DoDistribute pt = new DoDistribute(task); public Text txtSFileSum; /**
* @wbp.parser.entryPoint
*/
private SingletonGUI() {
final Display display = Display.getDefault();
final Shell shlG = new Shell(display, SWT.MIN | SWT.CLOSE);
shlG.setSize(500, 210);
shlG.setText("Show Information"); final Group groups = new Group(shlG, SWT.NONE);
groups.setText("Input");
groups.setBounds(40, 20, 420, 72); Label label_1 = new Label(groups, SWT.NONE);
label_1.setBounds(66, 37, 54, 12);
label_1.setText("sum"); txtSFileSum = new Text(groups, SWT.BORDER);
txtSFileSum.setEditable(false);
txtSFileSum.setBounds(126, 32, 157, 18);
txtSFileSum.setText(""); Button btnStart = new Button(shlG, SWT.NONE);
btnStart.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
System.exit(0);
}
});
btnStart.setToolTipText("");
btnStart.setBounds(116, 125, 72, 22);
btnStart.setText("start");
// 定时器事件
pt.start(1, 6); shlG.open();
shlG.layout();
while (!shlG.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} public static void main(String[] args) throws Exception {
// new SingletonGUITest();
}
}package pic;import java.util.TimerTask;import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;public class DistributeFile extends TimerTask {
public DistributeFile() {
} public void run() {
//这只是测试代码,每次走过 Come in ,就停住了,不知道为什么。
System.out.println("come in"); SingletonGUI.getInstance().txtSFileSum.setText("hello");//这个位置有问题? System.out.println("out");
}
}package pic;import java.util.TimerTask;
import java.util.Timer;public class DoDistribute {
private Timer timer;
private TimerTask task; public DoDistribute(TimerTask task) {
this.timer = new Timer();
this.task = task;
} public void start(int delay, int internal) {
timer.schedule(task, delay * 1000, internal * 1000);
}
}大家帮忙看看,怎么处理啊。
private static final SingletonGUI instance = new SingletonGUI(); public static SingletonGUI getInstance() {
return instance;
} 我觉得可以考虑把这一块改改
private static final SingletonGUI instance =null;public static synchronized SingletonGUI getInstance() {
if(null==instance){
instance=new SingletonGUI();
}else{
return instance;
}
}
private Display display;
private Shell shlG; private SingletonGUI() {
画面部分代码 略
} private void run() { // 启动定时器事件
pt.start(1, 6);
shlG.open();
shlG.layout();
while (!shlG.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
public static void main(String[] args) throws Exception {
SingletonGUI sg = SingletonGUI.getInstance();
sg.run();
}