0.原子性操作

  1. 完整执行。原子性操作可以靠硬件实现,也可以靠软件实现。

1.多个间断的原子性操作,不能保证原子性

  1. private static Vector<Integer> tickets = new Vector<>();
  2. static {
  3. for (int i = 0; i < 10000; i++) {
  4. tickets.add(i);
  5. }
  6. }
  7. public static void main(String[] args) {
  8. for (int i = 0; i < 10; i++) {
  9. new Thread(()->{
  10. while(tickets.size() > 0){
  11. try {
  12. TimeUnit.MILLISECONDS.sleep(10);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. System.out.println("销售票编号:" + tickets.remove(0));
  17. }
  18. }).start();
  19. }

首先Vector 的 size() 方法 和 remove 方法 都可以保证原子性。但是上面的逻辑不对。多个线程同时去排队判断 size >0 。于是又同时去排队执行 remove,就会导致
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0