您的位置:首页 > 编程语言 > Java开发

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);
}
}再次编译执行,这次的结果如下:



数字按照顺序自增,符合了预期。代码执行顺序没有乱。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: