Java学习笔记79. 多线程的同步机制 -- synchronized 关键字

当系统中存在多个线程,而多个线程所操作的都是同一块内存区域,那么,就有可能产生相互干扰的情况。比如下面的情况:

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);
        }
}

再次编译执行,这次的结果如下:

数字按照顺序自增,符合了预期。代码执行顺序没有乱。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值