Java语言怎么记录自身程序一共被用户运行了多少次?并且记录的数字不能放在文件里也不能被别的程序读取到的地方应该怎么才能实现的呢
你可以试一试弄一个在线数据库来记录运行次数。程序启动时就往在线数据库发送一个请求,数据库接收到请求后记录一次运行次数,并返回给程序。这样也可以实现记录运行次数,并且不会被其他程序读取到。
不知道你这个问题是否已经解决, 如果还没有解决的话:enum Singleton5 {//枚举类的单例模式
INSTANCE;
public Singleton5 getInstance(){
return INSTANCE;
}
}
1、 私有化构造器并不保险,通过反射机制调用私有构造器。而枚举类不能被反射,所以可以防止反射攻击
//模拟反射攻击
class Singleton {//双重校验锁,性能佳线程安全
private static Singleton4 instance=null;
private Singleton4() {}
public static Singleton4 getInstance() {
if(instance==null) {
synchronized (Singleton4.class) {
if (instance==null) {
//new对象分为三个操作
//分配内存
//调用构造方法初始化
//赋值
instance=new Singleton4();
}
}
}
return instance;
}
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Singleton s=Singleton.getInstance();
Singleton sUsual=Singleton.getInstance();
Constructor<Singleton> constructor=Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton sReflection=constructor.newInstance();
System.out.println(s+"\n"+sUsual+"\n"+sReflection);
System.out.println("正常情况下,实例化两个实例是否相同:"+(s==sUsual));
System.out.println("通过反射攻击单例模式情况下,实例化两个实例是否相同:"+(s==sReflection));
}
//com.lxp.pattern.singleton.Singleton@1540e19d
//com.lxp.pattern.singleton.Singleton@1540e19d
//.lxp.pattern.singleton.Singleton@677327b6
//正常情况下,实例化两个实例是否相同:true
//通过反射攻击单例模式情况下,实例化两个实例是否相同:false
2.避免序列化问题(任何一个readObject方法,不管是显式的还是默认的,它都会返回一个新建的实例,这个新建的实例不同于该类初始化时创建的实例)
可以使用Java自带的计数器类--AtomicInteger。AtomicInteger是一个线程安全的类,可以用来实现计数器功能。
以下是一个示例代码,演示如何使用AtomicInteger来记录Java程序被用户运行的次数:
import java.util.concurrent.atomic.AtomicInteger;
public class ProgramCounter {
private static AtomicInteger counter = new AtomicInteger(0);
public static int getCount() throws Exception {
return counter.get();
}
public static void increment() throws Exception {
counter.incrementAndGet();
}
public static void main(String[] args) throws Exception {
while (true) {
System.out.println("Program has been run " + getCount() + " times.");
increment();
Thread.sleep(1000); // 等待一秒钟再运行下一次循环
}
}
}
在这个示例代码中,定义了一个静态的AtomicInteger对象counter,用来记录程序被用户运行的次数。定义了两个方法getCount()和increment(),分别用于获取计数器的值和增加计数器的值。在主方法中,使用while循环不断地输出计数器的值,并使用Thread.sleep()方法让程序暂停一秒钟,以便计数器的值可以被更新。
由于AtomicInteger类是线程安全的,因此不需要担心多个线程同时访问计数器导致计数器值不正确的问题。同时,由于AtomicInteger类是一个内部类,因此不需要将计数器的值保存到文件或数据库中,也不需要将计数器的值暴露给其他程序。