1700445591
1700445592
16—火车票96530
1700445593
1700445594
注意看,上面有两个线程在卖同一张火车票,这才是线程不同步的问题,此时把ArrayList修改为Vector即可解决问题,因为Vector的每个方法前都加上了synchronized关键字,同时只会允许一个线程进入该方法,确保了程序的可靠性。
1700445595
1700445596
虽然在系统开发中我们一再说明,除非必要,否则不要使用synchronized,这是从性能的角度考虑的,但是一旦涉及多线程时(注意这里说的是真正的多线程,不是并发修改的问题,比如一个线程增加,一个线程删除,这不属于多线程的范畴),Vector会是最佳选择,当然自己在程序中加synchronized也是可行的方法。
1700445597
1700445598
HashMap的线程安全类HashTable与此相同,不再赘述。
1700445599
1700445600
注意 多线程环境下考虑使用Vector或HashTable。
1700445601
1700445602
1700445603
1700445604
1700445606
编写高质量代码:改善Java程序的151个建议 建议81:非稳定排序推荐使用List
1700445607
1700445608
我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet,该类实现了类默认排序为升序的Set集合,如果插入一个元素,默认会按照升序排列(当然是根据Comparable接口的compareTo的返回值确定排序位置了),不过,这样的排序是不是在元素经常变化的场景中也适用呢?我们来看例子:
1700445609
1700445610
public static void main(String[]args){
1700445611
1700445612
SortedSet<Person>set=new TreeSet<Person>();
1700445613
1700445614
//身高180CM
1700445615
1700445616
set.add(new Person(180));
1700445617
1700445618
//身高175CM
1700445619
1700445620
set.add(new Person(175));
1700445621
1700445622
for(Person p:set){
1700445623
1700445624
System.out.println(“身高:”+p.getHeight());
1700445625
1700445626
}
1700445627
1700445628
}
1700445629
1700445630
static class Person implements Comparable<Person>{
1700445631
1700445632
//身高
1700445633
1700445634
private int height;
1700445635
1700445636
public Person(int_age){
1700445637
1700445638
height=_age;
1700445639
1700445640
}
[
上一页 ]
[ :1.700445591e+09 ]
[
下一页 ]