天天看点

并发集合(九)使用原子 arrays

当你实现一个多个线程共享一个或者多个对象的并发应用时,你就要使用像锁或者同步关键词(例如synchronized)来对他们的属性的访问进行保护,来避免并发造成的数据不一致的错误。

但是这些机制会有以下一些缺点:

死锁(dead lock):例如:当一个线程等待一个锁的时候,会被阻塞,而这个锁被其他线程占用并且永不释放。这种情况就是死锁,程序在这种情况下永远都不会往下执行。

即使只有一个线程在访问共享对象,它也要执行必要的获取锁和释放锁的代码。

cas(compare-and-swap)操作为并发操作对象的提供更好的性能,cas操作通过以下3个步骤来实现对变量值得修改:

获取当前内存中的变量的值

用一个新的临时变量(temporal variable)保存改变后的新值

如果当前内存中的值等于变量的旧值,则将新值赋值到当前变量;否则不进行任何操作

对于这个机制,你不需要使用任何同步机制,这样你就避免了 deadlocks,也获得了更好的性能。这种机制能保证多个并发线程对一个共享变量操作做到最终一致。

java 在原子类中实现了cas机制。这些类提供了compareandset() 方法;这个方法是cas操作的实现和其他方法的基础。

java 中还引入了原子array,用来实现integer类型和long类型数组的操作。在这个指南里,你将要学习如何使用atomicintegerarray 类来操作原子 arrays。

指南中的例子是在eclipse ide下面实现的,你也可以使用其他ide例如netbeans来实现:

那要怎么做呢….

按照这些步骤来实现下面的例子:

<code>01</code>

<code>//1.创建一个类,名为 incrementer,并实现 runnable 接口。</code>

<code>02</code>

<code>public</code> <code>class</code> <code>incrementer </code><code>implements</code> <code>runnable {</code>

<code>03</code>

<code>04</code>

<code>//2.声明一个私有 atomicintegerarray 属性,名为 vector,用来储存一个整数 array。</code>

<code>05</code>

<code>private</code> <code>atomicintegerarray vector;</code>

<code>06</code>

<code>07</code>

<code>//3.实现类的构造函数,初始化它的属性值。</code>

<code>08</code>

<code>public</code> <code>incrementer(atomicintegerarray vector) {</code>

<code>09</code>

<code>         </code><code>this</code><code>.vector=vector;</code>

<code>10</code>

<code>}</code>

<code>11</code>

<code>12</code>

<code>//4.实现 run() 方法。使用 getandincrement() 方操作array里的所有元素。</code>

<code>13</code>

<code>@override</code>

<code>14</code>

<code>public</code> <code>void</code> <code>run() {</code>

<code>15</code>

<code>         </code><code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;vector.length(); i++){</code>

<code>16</code>

<code>                 </code><code>vector.getandincrement(i);</code>

<code>17</code>

<code>         </code><code>}</code>

<code>18</code>

<code>19</code>

<code>20</code>

<code>//5.创建一个类,名为 decrementer,并实现 runnable 接口。</code>

<code>21</code>

<code>public</code> <code>class</code> <code>decrementer </code><code>implements</code> <code>runnable {</code>

<code>22</code>

<code>23</code>

<code>//6.声明一个私有 atomicintegerarray 属性,名为 vector,用来储存一个整数 array。</code>

<code>24</code>

<code>25</code>

<code>26</code>

<code>//7.实现类的构造函数,初始化它的属性值。</code>

<code>27</code>

<code>public</code> <code>decrementer(atomicintegerarray vector) {</code>

<code>28</code>

<code>29</code>

<code>30</code>

<code>31</code>

<code>//8.实现 run() 方法。使用 getanddecrement() 方法操作array里的所有元素。</code>

<code>32</code>

<code>33</code>

<code>34</code>

<code>         </code><code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;vector.length(); i++) {</code>

<code>35</code>

<code>         </code><code>vector.getanddecrement(i);</code>

<code>36</code>

<code>37</code>

<code>38</code>

<code>39</code>

<code>//9.我们创建一个示例来进行示范,创建一个类,名为 main 并添加 main()方法。</code>

<code>40</code>

<code>public</code> <code>class</code> <code>main {</code>

<code>41</code>

<code>         </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>

<code>42</code>

<code>43</code>

<code>//10.声明一个常量,名为 threads,分配它的值为 100。创建一个有1,000个元素的 atomicintegerarray 对象。</code>

<code>44</code>

<code>final</code> <code>int</code> <code>threads=</code><code>100</code><code>;</code>

<code>45</code>

<code>atomicintegerarray vector=</code><code>new</code> <code>atomicintegerarray(</code><code>1000</code><code>);</code>

<code>46</code>

<code>47</code>

<code>//11. 创建一个 incrementer 任务来操作之前创建的原子 array。</code>

<code>48</code>

<code>incrementer incrementer=</code><code>new</code> <code>incrementer(vector);</code>

<code>49</code>

<code>50</code>

<code>//12.创建一个 decrementer 任务来操作之前创建的原子 array。</code>

<code>51</code>

<code>decrementer decrementer=</code><code>new</code> <code>decrementer(vector);</code>

<code>52</code>

<code>53</code>

<code>//13.创建2个array 分别存储 100 个thread 对象。</code>

<code>54</code>

<code>thread threadincrementer[]=</code><code>new</code> <code>thread[threads];</code>

<code>55</code>

<code>thread threaddecrementer[]=</code><code>new</code> <code>thread[threads];</code>

<code>56</code>

<code>57</code>

<code>//14.创建并运行 100 个线程来执行 incrementer 任务和另外 100 个线程来执行 decrementer 任务。把线程储存入之前创建的arrays内。</code>

<code>58</code>

<code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;threads; i++) {</code>

<code>59</code>

<code>         </code><code>threadincrementer[i]=</code><code>new</code> <code>thread(incrementer);</code>

<code>60</code>

<code>         </code><code>threaddecrementer[i]=</code><code>new</code> <code>thread(decrementer);</code>

<code>61</code>

<code>62</code>

<code>         </code><code>threadincrementer[i].start();</code>

<code>63</code>

<code>         </code><code>threaddecrementer[i].start();</code>

<code>64</code>

<code>65</code>

<code>//15.使用 join() 方法来等待线程的完结。</code>

<code>66</code>

<code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;</code><code>100</code><code>; i++) {</code>

<code>67</code>

<code>         </code><code>try</code> <code>{</code>

<code>68</code>

<code>                 </code><code>threadincrementer[i].join();</code>

<code>69</code>

<code>                 </code><code>threaddecrementer[i].join();</code>

<code>70</code>

<code>         </code><code>} </code><code>catch</code> <code>(interruptedexception e) {</code>

<code>71</code>

<code>                 </code><code>e.printstacktrace();</code>

<code>72</code>

<code>73</code>

<code>74</code>

<code>//16.把原子array里非0的元素写入操控台。使用 get() 方法来获取原子 array 元素。</code>

<code>75</code>

<code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;vector.length(); i++) {</code>

<code>76</code>

<code>         </code><code>if</code> <code>(vector.get(i)!=</code><code>0</code><code>) {</code>

<code>77</code>

<code>                 </code><code>system.out.println(</code><code>"vector["</code><code>+i+</code><code>"] : "</code><code>+vector.get(i));</code>

<code>78</code>

<code>79</code>

<code>80</code>

<code>81</code>

<code>//17.在操控台写个信息表明例子结束。</code>

<code>82</code>

<code>system.out.println(</code><code>"main: end of the example"</code><code>);</code>

它是怎么工作的…

在这个例子里,你实现了2个不同的任务来操作 atomicintegerarray 对象:

incrementer task: 这个类使用getandincrement()方法array里的全部元素 +1

decrementer task: 这个类使用getanddecrement()方法array里的全部元素 -1

在 main 类,你创建了有1000个元素的 atomicintegerarray,然后你执行了100次 incrementer 和100次 decrementer 任务。在任务结束后,如果没有出现任何数据不一致错误,那么array的全部元素的值都为0。如果你运行这个任务,由于全部元素都是0,你只会看到程序在操控台只写了结束信息。

更多…

如今,java仅提供了另一个原子 array类。它是 atomiclongarray 类,与 integeratomicarray 类提供了相同的方法。

这些类的一些其他有趣的方法有:

get(int i): 返回array中第i个位置上的值

set(int i, int newvalue): 设置array中第i个位置上的值为newvalue

参见

第六章,并发集:使用原子变量

继续阅读