<commit_before>`同步`是开发者经常提起的词汇，但是很多时候都是很空洞的，大家都知道可以使用`synchronized`或者`Lock`来控制线程的同步访问，但是很多时候缺少实践。最近看到这样一个问题：两个线程如何顺序地从一个数组里面取数据。举例来说就是有两个线程：thread1和thread2，一个数组array，怎样得到下面这样的输出：

```
threa1 get array[0]
threa2 get array[1]
threa1 get array[2]
threa2 get array[3]
...
```

### 想法

一开始我的想法是直接用`Lock`做线程的同步去实现，具体的代码如下：

```java
public class PrintInOrder {
    private Lock lock = new ReentrantLock(true);
    private List<Integer> list;
    private int index;

    public PrintInOrder(List<Integer> list) {
        this.list = list;
    }

    private void print() {
        lock.lock();
        try {
            System.out.printf("thread:%s get %d \n", Thread.currentThread().getName(), list.get(index++));
        } finally {
            lock.unlock();
        }
    }

    public boolean hasMore() {
        return index < list.size() - 1;<commit_msg>Update 2019-09-20-两个线程按顺序取元素.md<commit_after>`同步`是开发者经常提起的词汇，但是很多时候都是很空洞的，大家都知道可以使用`synchronized`或者`Lock`来控制线程的同步访问，但是很多时候缺少实践。最近看到这样一个问题：两个线程如何顺序地从一个数组里面取数据。举例来说就是有两个线程：thread1和thread2，一个数组array，怎样得到下面这样的输出：

```
thread1 get array[0]
thread2 get array[1]
thread1 get array[2]
thread2 get array[3]
...
```

### 想法

一开始我的想法是直接用`Lock`做线程的同步去实现，具体的代码如下：

```java
public class PrintInOrder {
    private Lock lock = new ReentrantLock(true);
    private List<Integer> list;
    private int index;

    public PrintInOrder(List<Integer> list) {
        this.list = list;
    }

    private void print() {
        lock.lock();
        try {
            System.out.printf("thread:%s get %d \n", Thread.currentThread().getName(), list.get(index++));
        } finally {
            lock.unlock();
        }
    }

    public boolean hasMore() {
        return index < list.size() - 1;
{'fraction_non_alphanumeric': 0.13310185185185186, 'fraction_numerical': 0.017361111111111112, 'mean_word_length': 3.3225, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2397083', 'n_tokens_mistral': 787, 'n_tokens_neox': 813, 'n_words': 110}