读书人

一些多线程的札记

发布时间: 2012-12-24 10:43:14 作者: rapoo

一些多线程的笔记

1. 保护方法原子性的同时,也要注意保护方法中使用到的变量。下面这段代码是否一定安全?

?

public class Counter {private int counter = 0;public int getCounter() {return counter;}public synchronized void add1() {int count = counter;counter = count + 1;}//other method}
?

不一定,如果在other method中也处理counter但是又没有保护的情况下,会出现问题,例如

?

public class Counter {private int counter = 0;public int getCounter() {return counter;}public synchronized void add1() {System.out.println("Enter add1");int count = counter;try {System.out.println("Add1 sleep");Thread.sleep(1000);System.out.println("Add1 wake up");} catch(Exception e) {e.printStackTrace();}counter = count + 1;}public  void add2() {System.out.println("Enter add2");int count = counter;counter = count + 1;System.out.println("Exit add2");}}

?

执行以下代码可以看到效果

?

public static void main(String[] args) throws Exception {final Counter c = new Counter();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {c.add1();}});Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {c.add2();}});t1.start();t2.start();Thread.sleep(2000);System.out.println(c.getCounter());}
?

输入结果:

Enter add1

Add1 sleep

Enter add2

Exit add2

Add1 wake up

Exit add1

1

读书人网 >编程

热点推荐