84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
学习是最好的投资!
用synchronized关键字
synchronized
给list加上volatile关键字
今天刚刚看过并发编程实战关于可变对象的安全发布与访问:安全发布:
在静态初始化函数中初始化一个对象引用;
将对象的引用保存在volatile或AtomicReference上
将对象的引用保存到某个正确构造对象的final类型上
将对象保存在一个锁的范围内.
安全访问:
线程封闭
只读共享
线程安全共享, 该发布对象内部的访问方式是线程安全的, 就不需要外部同步了
保护对象, 发布可变对象的对象通过限制外界的访问, 指定访问可变对象的接口.
static List<String> arrayList = new ArrayList<>();这样已经符合了安全发布的第一条那么就要保证安全访问了, 由于list肯定不能安全访问的前三种情况, 那么只能依靠在发布对象时,限制外界的访问, 也就是加锁.
static List<String> arrayList = new ArrayList<>();
可以按照题主的要求实现,不过这种需求的实现很诡异。
private static void test1(final int i) { new Thread(new Runnable() { @Override public void run() { synchronized (arrayList) { while (arrayList.size() != i) { try { arrayList.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } arrayList.add(i, i + "position"); arrayList.notifyAll(); } } }).start(); }
除了这种方式,还可以通过join和传入countdownlatch来实现.如果真的想像题主这样子的话,还不如不用多线程
join
countdownlatch
用线程池的invokeAll方法,可以保证结果的顺序和传入参数的顺序一致
public static void main(String[] args) { ExecutorService exec = Executors.newFixedThreadPool(10); List<Callable<Integer>> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { list.add(newTask(i)); } try { for (Future<Integer> future : exec.invokeAll(list)) { try { System.out.println(future.get()); } catch (ExecutionException e) { e.printStackTrace(); } } } catch (InterruptedException e) { e.printStackTrace(); } exec.shutdown(); } static Callable<Integer> newTask(final int t) { return new Callable<Integer>() { @Override public Integer call() throws Exception { System.out.println("newTask: " + t); try { Thread.sleep((10 - t) * 1000); } catch (InterruptedException e) { e.printStackTrace(); } return t; } } }
用
synchronized
关键字给list加上volatile关键字
今天刚刚看过并发编程实战关于可变对象的安全发布与访问:
安全发布:
在静态初始化函数中初始化一个对象引用;
将对象的引用保存在volatile或AtomicReference上
将对象的引用保存到某个正确构造对象的final类型上
将对象保存在一个锁的范围内.
安全访问:
线程封闭
只读共享
线程安全共享, 该发布对象内部的访问方式是线程安全的, 就不需要外部同步了
保护对象, 发布可变对象的对象通过限制外界的访问, 指定访问可变对象的接口.
static List<String> arrayList = new ArrayList<>();
这样已经符合了安全发布的第一条那么就要保证安全访问了, 由于list肯定不能安全访问的前三种情况, 那么只能依靠在发布对象时,限制外界的访问, 也就是加锁.
可以按照题主的要求实现,不过这种需求的实现很诡异。
除了这种方式,还可以通过
join
和传入countdownlatch
来实现.如果真的想像题主这样子的话,还不如不用多线程用线程池的invokeAll方法,可以保证结果的顺序和传入参数的顺序一致