疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

在Java如何保证方法是线程安全的


 

   

  切入正题

  开门见山,今天看到别人写的一段关于方法是否线程安全的文章,比较简单,但是由于自己也是刚开始入门,所以就迈下了第一步。由于注释还算比较详细,所以就不废话了,直接上code。

  此方法不是线程安全的

  14 package never.uncategory;

  15

  16 public class NotThreadSafeCounter extends Thread {

  17

  18 private static int counter = 0;

  19

  20 public void run() {

  21 System.out.println("counter:" + getCount());

  22 }

  23

  24 public static int getCount() {

  25

  26 try {

  27 Thread.sleep(1500);

  28 } catch (Exception e) {

  29 e.printStackTrace();

  30 }

  31 return counter++;

  32

  33 }

  34

  35 public static void main(String[] args) {

  36

  37 for (int i = 0; i < 5; i++) {

  38 new NotThreadSafeCounter().start();

  39 }

  40 }

  41

  42 }

  此方法是线程安全的(synchronized)

  复制代码

  12 package never.uncategory;

  13

  14 public class ThreadSafeCounter {

  15

  16 private static int counter = 0;

  17

  18 public void run() {

  19 System.out.println("counter:" + getCount());

  20 }

  21

  22 public static synchronized int getCount() {

  23 return counter++;

  24 }

  25

  26 public static void main(String[] args) {

  27

  28 for (int i = 0; i < 5; i++) {

  29 new NotThreadSafeCounter().start();

  30 }

  31 }

  32

  33 }

  此方法也是线程安全的(AtomicInteger)

  复制代码

  1 /**

  8 package never.uncategory;

  9

  10 import java.util.concurrent.atomic.AtomicInteger;

  11

  12 public class ThreadSafeCounter2 {

  13

  14 private static AtomicInteger counter = new AtomicInteger(0);

  15

  16 public void run() {

  17 System.out.println("counter:" + getCount());

  18 }

  19

  20 public static int getCount() {

  21 return counter.getAndIncrement();

  22 }

  23

  24 public static void main(String[] args) {

  25

  26 for (int i = 0; i < 5; i++) {

  27 new NotThreadSafeCounter().start();

  28 }

  29 }

  30 }