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() {
@Override
public void run() {
c.add1();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public 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
分享到:
相关推荐
多线程学习笔记,好资源。包括线程基础等知识多线程学习笔记,好资源。包括线程基础等知识
马士兵多线程训练营上课笔记
Java线程的知识点总结。doc
马士兵多线程训练营笔记
多线程学习笔记,通过平时的学习所做的一些笔记,希望对广大同仁有所帮助
多线程笔记,包含线程创建,线程开启,线程命名,线程同步
使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。 一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。 Java中,每个线程都有一个...
C#多线程笔记 每个窗体都有自己的都在不同的线程上运行,如果需要在窗体之间交互,就需要在线程之间交互。
C# 多线程 笔记 适合 初学者 共含所有7个word文档,转载
详细的Java多线程笔记,一共17章,能够让你更加了解多线程.线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
Python3 多线程
java多线程笔记分享
C#多线程笔记学习指南
java学习笔记2(多线程)java学习笔记2(多线程)
java中的多线程笔记
多线程学习笔记 包含doc文档笔记加笔记中出现的代码(博文地址共上中下)http://blog.csdn.net/cloudyxuq/article/details/6941404
java中数据流和多线程较深入的了解,这是分享别人的学习笔记
狂神说多线程详解笔记