四个java类
附上代码(比较简单)用于设计模式课程需要
登录类
package mytest.demo.WebCount;
public class Login implements Runnable {
// 登录名称
private String loginName;
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
@Override
public void run() {
// 登录成功后调用单例对象进行计数
LazySingleton lazySingleton =LazySingleton.getInstance();
lazySingleton.setCount();
System.out.println(getLoginName()+"登录成功:"+lazySingleton);
//创建窗口,但是加了之后影响了随机性,所以在run函数里加就行了
new LoginWindows("用户登录",getLoginName());
}
}
加个简单可视化界面
package mytest.demo.WebCount;
import java.awt.*;
import java.awt.event.*;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class LoginWindows extends JFrame { //需要继承JFrame
public LoginWindows(String title, String userInfo) {
JFrame jf = new JFrame(title);
Container conn = jf.getContentPane(); //得到窗口的容器
JLabel L1 = new JLabel(userInfo+"已登录"); //创建一个标签 并设置初始内容
conn.add(L1);
jf.setBounds(200, 200, 300, 200); //设置窗口的属性 窗口位置以及窗口的大小
jf.setVisible(true);//设置窗口可见
jf.setDefaultCloseOperation(DISPOSE_ON_CLOSE); //设置关闭方式 如果不设置的话 似乎关闭窗口之后不会退出程序
}
}
线程安全的单例类,读者可以试一下简单单例类的实现结果是什么样子的
package mytest.demo.WebCount;
import java.util.concurrent.atomic.AtomicLong;
public class LazySingleton {
// 单例对象 ,加入volatile关键字进行修饰
private static volatile LazySingleton APP_INSTANCE;
// 计数器
private AtomicLong count = new AtomicLong(0);
// 单例模式必须保证默认构造方法为私有类型
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (APP_INSTANCE == null) {
// 对类进行加锁,并进行双重检查
synchronized (LazySingleton.class) {
if (APP_INSTANCE == null) {
APP_INSTANCE = new LazySingleton();
}
}
}
return APP_INSTANCE;
}
public AtomicLong getCount() {
return count;
}
public void setCount() {
count.addAndGet(1);
}
}
主函数
package mytest.demo.WebCount;
public class Main {
public final static int num = 7;
public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[num];
for (int i = 0; i < num; i++) {
Login login = new Login();
login.setLoginName("" + String.format("%2s", (i + 1)) + "号用户");
threads[i] = new Thread(login);
threads[i].start();
}
for (int i = 0; i < threads.length; i++) {
threads[i].join();
}
// 调用单例对象输出登录人数统计
System.out.println("网站共有" + LazySingleton.getInstance().getCount() + "个用户登录");
}
}
运行结果: