java相关问题

java打jar包的几种方式详解

用记事本写一个Hello.java的文件

class Hello{
    public static void main(String[] agrs){
    	System.out.println("hello");
    }
}

用命令行进入到该目录下,编译这个文件

javac Hello.java

将编译后的Hello.class文件打成jar

jar -cvf hello.jar Hello.class 

c表示要创建一个新的jar包,v表示创建的过程中在控制台输出创建过程的一些信息,f表示给生成的jar包命名

运行jar包

 java -jar hello.jar

执行报错

jar -cvfm hello.jar manifest.txt Hello.class Tom.class 
manifest.txt内的内容:
Main-Class: com.game.Hello

System.exit

System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序

System.exit(0)
System.exit(1)

synchronized

添加不同位置的不同含义

  1. 对当前对象加锁

对当前对象加锁(对象锁对于不同的对象实例没有锁的约束)实例对象被lock,则该实例对象的所有同步方法全被lock
synchronized methods(){} 与synchronized(this){}之间没有什么区别。
只是synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。

synchronized(this) {}
public void synchronized save();
  1. 对当前类加锁

上边的例子中试图使用这种方法达到互斥方法打印方法,但是事实是这样做是没有效果的,因为每个Trans对象都有自己的Object对象,这两个对象都有自己的锁,所以两个线程需要的是不同锁,两个锁之间没有任何相互作用,不会起到同步作用。

synchronized(A.class) {}
public void static synchronized save();

想要达到效果

不同的类使用的就是同一个object对象,需要的锁也是同一个锁,就可以达到互斥的效果了。

private Object lock = new Object();
synchronized(lock) {}

缺点

将一个大的方法声明为synchronized 将会大大影响效率

  1. 总结

synchronized是一种独享锁

多线程中,只要是同一个对象,synchronized不管锁多少方法,对象锁都起作用

多线程中,不是同一个对象,对象锁没有约束。

多线程中,不同的对象,类锁具有约束性。

对象锁与类锁互不干扰,与对象无关

https://www.cnblogs.com/lixuwu/p/5676143.html

ConcurrentModificationException

如下操作 如果在遍历的时候有add操作就会报错

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");

for(String str:list){
    list.add("C");
}
java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)

修改

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");

//        for(String str:list){
//            list.add("C");
//        }

int num = list.size();
for (int i=0;i< num;i++){
    list.add("C");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值