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
添加不同位置的不同含义
- 对当前对象加锁
对当前对象加锁(对象锁对于不同的对象实例没有锁的约束)实例对象被lock,则该实例对象的所有同步方法全被lock
synchronized methods(){} 与synchronized(this){}之间没有什么区别。
只是synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。
synchronized(this) {}
public void synchronized save();
- 对当前类加锁
上边的例子中试图使用这种方法达到互斥方法打印方法,但是事实是这样做是没有效果的,因为每个Trans对象都有自己的Object对象,这两个对象都有自己的锁,所以两个线程需要的是不同锁,两个锁之间没有任何相互作用,不会起到同步作用。
synchronized(A.class) {}
public void static synchronized save();
想要达到效果
不同的类使用的就是同一个object对象,需要的锁也是同一个锁,就可以达到互斥的效果了。
private Object lock = new Object();
synchronized(lock) {}
缺点
将一个大的方法声明为synchronized 将会大大影响效率
- 总结
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");
}

被折叠的 条评论
为什么被折叠?



