赞
踩
package JUC; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * @author zhaolimin * @date 2021/11/13 * @apiNote ArrayList类不安全测试 */ public class ArrayListNotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0; i < 50; i++) { new Thread(() -> { list.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(list); }, String.valueOf(i)).start(); } // java.util.ConcurrentModificationException 出现了快速失败机制 } }
public static void main(String[] args) {
List<String> list = new Vector<>();
for (int i = 0; i < 50; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
public static void main(String[] args) {
List<String> list = Collections.synchronizedList(new ArrayList<>());
for (int i = 0; i < 50; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
public static void main(String[] args) {
List<String> list = new CopyOnWriteArrayList<>();
for (int i = 0; i < 50; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
/** 追加一个特殊的元素到这个List集合的尾部。 */ public boolean add(E e) { // 用 ReentrantLock 加锁 final ReentrantLock lock = this.lock; lock.lock(); // 注:JDK9以后已经改为 synchronized 加锁了。 try { // 拿到旧表 Object[] elements = getArray(); // 拿到旧表的长度 int len = elements.length; // 在旧表的基础上拷贝并长度 + 1 新表 Object[] newElements = Arrays.copyOf(elements, len + 1); // 在新表的末尾追加要添加的元素 newElements[len] = e; // 将当前表设置为新表 setArray(newElements); // 返回添加成功 return true; } finally { // 解锁 lock.unlock(); } }
package JUC; import java.util.HashSet; import java.util.UUID; /** * @author zhaolimin * @date 2021/11/14 * @apiNote HashSet线程不安全测试。 */ public class HashSetNotSafeDemo { public static void main(String[] args) { HashSet<String> strings = new HashSet<>(); for (int i = 0; i < 50; i++) { new Thread(() -> { strings.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(strings); }, String.valueOf(i)).start(); } } }
public static void main(String[] args) {
Set<String> strings = Collections.synchronizedSet( new HashSet<>());
for (int i = 0; i < 50; i++) {
new Thread(() -> {
strings.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(strings);
}, String.valueOf(i)).start();
}
}
public static void main(String[] args) {
CopyOnWriteArraySet<String> strings = new CopyOnWriteArraySet<>();
for (int i = 0; i < 50; i++) {
new Thread(() -> {
strings.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(strings);
}, String.valueOf(i)).start();
}
}
private final CopyOnWriteArrayList<E> al; // 可以看到数据结构其实是一个 CopyOnWriteArrayList 类的对象
// 让我联想到了 HashSet 和 HashMap 的关系。
public CopyOnWriteArraySet() {
// 调用的是 CopyOnWriteArrayList 的构造函数
al = new CopyOnWriteArrayList<E>();
}
package JUC; import java.util.*; /** * @author zhaolimin * @date 2021/11/14 * @apiNote HashMap线程不安全 */ public class HashMapNotSafeDemo { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); for (int i = 0; i < 50; i++) { new Thread(() -> { map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,8)); System.out.println(map); }, String.valueOf(i)).start(); } } }
public static void main(String[] args) {
Map<Object, Object> objectObjectMap = Collections.synchronizedMap(new HashMap<>());
for (int i = 0; i < 40; i++) {
new Thread(() -> {
objectObjectMap.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,8));
System.out.println(objectObjectMap);
}, String.valueOf(i)).start();
}
}
public static void main(String[] args) {
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i < 40; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,8));
System.out.println(map);
}, String.valueOf(i)).start();
}
}
public class Person { private Integer id; private String personName; public Person() { } public Person(String personName) { this.personName = personName; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getPersonName() { return personName; } public void setPersonName(String personName) { this.personName = personName; } }
public class TestTransferValueDemo { public void changeValue1(int age) { age = 30; } public void changeValue2(Person person) { person.setPersonName("zlm"); } public void changeValue3(String str) { str = "wl"; } // main线程在栈内存启动 public static void main(String[] args) { TestTransferValueDemo testTransferValueDemo = new TestTransferValueDemo(); // 基本数据类型 int age = 20; testTransferValueDemo.changeValue1(age); System.out.println("-------- age = " + age); Person person = new Person("xxx"); testTransferValueDemo.changeValue2(person); System.out.println("-------- personName = " + person.getPersonName()); String str = "xxx"; testTransferValueDemo.changeValue3(str); System.out.println("-------- str = " + str); } }
/*
-------- age = 20
-------- personName = zlm
-------- str = xxx
*/
栈管运行,堆管存储。
栈空间是线程私有,堆的是数据共享。
age的结果:
person的结果:
str的结果:
String str = new String("hello world");
运行期创建就存储在堆中。String str = "hello world;"
编译期创建的放在常量池中。码云仓库同步笔记,可自取欢迎各位star指正:https://gitee.com/noblegasesgoo/notes
如果出错希望评论区大佬互相讨论指正,维护社区健康大家一起出一份力,不能有容忍错误知识。
—————————————————————— 爱你们的 noblegasesgoo
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。