Java学习笔记79. 多线程的同步机制 -- synchronized 关键字
2018-03-11 19:02
671 查看
当系统中存在多个线程,而多个线程所操作的都是同一块内存区域,那么,就有可能产生相互干扰的情况。比如下面的情况:class threaddemo implements Runnable{ //实现了Runnable接口的类
private int n = 0; //私有全局变量
public void run(){ //覆盖run方法
test();
}
private void test(){ //私有方法test
for(int i=1;i<10;i++){ //将n的值自增9遍,每自增一次,输出一次
n++;
System.out.print(n); //输出n的值
}
}
}
public class demoSynchronized{
public static void main(String[] args){
//创建两个线程实例,并分别启动
threaddemo m = new threaddemo();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
t1.start();
t2.start();
}
}
多次执行之后的结果为
可见,有时候程序先输出1,有时候程序先输出2。这是因为,线程t1在执行完n++之后,有可能直接输出n,也有可能执行线程t2的n++语句之后,再输出n。两个线程在争夺对变量n的操作,导致程序没有办法按照预计的结果输出。
为了避免这种情况,就要在一个线程执行某个程序段的时候,将这个程序段锁定,等这个线程执行完之后,再释放资源给别的线程。这样就可以避免对内存的重复操作,达到线程同步的目的。同步的语法是:访问控制符 synchronized 返回值类型 方法名(参数){
...; //方法体
}于是,将test方法改为:private synchronized void test(){
for(int i=1;i<10;i++){
n++;
System.out.print(n);
}
}再次编译执行,这次的结果如下:
数字按照顺序自增,符合了预期。代码执行顺序没有乱。
private int n = 0; //私有全局变量
public void run(){ //覆盖run方法
test();
}
private void test(){ //私有方法test
for(int i=1;i<10;i++){ //将n的值自增9遍,每自增一次,输出一次
n++;
System.out.print(n); //输出n的值
}
}
}
public class demoSynchronized{
public static void main(String[] args){
//创建两个线程实例,并分别启动
threaddemo m = new threaddemo();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
t1.start();
t2.start();
}
}
多次执行之后的结果为
可见,有时候程序先输出1,有时候程序先输出2。这是因为,线程t1在执行完n++之后,有可能直接输出n,也有可能执行线程t2的n++语句之后,再输出n。两个线程在争夺对变量n的操作,导致程序没有办法按照预计的结果输出。
为了避免这种情况,就要在一个线程执行某个程序段的时候,将这个程序段锁定,等这个线程执行完之后,再释放资源给别的线程。这样就可以避免对内存的重复操作,达到线程同步的目的。同步的语法是:访问控制符 synchronized 返回值类型 方法名(参数){
...; //方法体
}于是,将test方法改为:private synchronized void test(){
for(int i=1;i<10;i++){
n++;
System.out.print(n);
}
}再次编译执行,这次的结果如下:
数字按照顺序自增,符合了预期。代码执行顺序没有乱。
相关文章推荐
- java多线程学习笔记——synchronized关键字
- Java多线程总结笔记(三)—— 同步和锁机制、synchronized
- Java学习笔记—多线程(synchronized关键字)
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结
- 九、初学Java多线程:使用Synchronized关键字同步类方法
- Java的synchronized关键字:同步机制总结
- Java线程同步机制synchronized关键字的理解
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结
- (转)初学Java多线程:使用Synchronized关键字同步类方法
- Java的synchronized关键字:同步机制总结
- Java线程同步机制synchronized关键字的理解
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结
- 初学Java多线程:使用Synchronized关键字同步类方法
- Java的synchronized关键字:同步机制总结