动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

浅析Synchronized关键字

05-26 15:14 601浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Synchronized关键字用一句话来解释其作用就是:能够保证同一时刻最多只有一个线程执行该段代码,以达到并发安全的效果。也就是说Synchronized就好比是一把锁,某个线程把资源锁住了之后,别人就不能使用了,只有当这个线程用完了别人才能用。

对于Synchronized关键字来说,它是并发编程中一个元老级角色,也就是说你只要学习并发编程,就必须要学习Synchronized关键字。由此可见其地位。

说了这么多,好像我们还没体验过它的威力。我们就直接举个例子,来分析一下。

public class SynTest01 implements Runnable{
    static int a=0;
    public static void main(String[] args) 
                throws InterruptedException {
        SynTest01 syn= new SynTest01();
        Thread thread1 = new Thread(syn);
        Thread thread2 = new Thread(syn);
        thread1.start();thread1.join();
        thread2.start();thread2.join();
        System.out.println(a);
    }
    @Override
    public void run() {
        for(int i=0;i<1000;i++) {
            a++;
        }
    }
}

上面代码要完成的功能就是,thread1对a进行增加,一直到1000,thread2再对a进行增加,一直到2000。不过如果我们运行过之后我们就会发现,最后的输出值总是小于2000,这是为什么呢?

这是因为我们在执行a++的时候其实包含了以下三个操作:

1.线程1读取a

2.线程1将a加1

3.将a的值写入内存

出错原因的关键就在于第二操作和第三个操作之间,此时线程1还没来得及把a的值写入内存,线程2就把旧值读走了,这也就造成了a加了两次,但是内存中的a的值只增加了1。这也就是不同步现象。

但是如果说我们使用了Synchronized关键字之后呢?

public class SynTest01 implements Runnable{
    static int a=0;
    Object object = new Object();
    public static void main(String[] args) throws InterruptedException {
        SynTest01 syn= new SynTest01();
        Thread thread1 = new Thread(syn);
        Thread thread2 = new Thread(syn);
        thread1.start();thread1.join();
        thread2.start();thread2.join();
        System.out.println(a);
    }
    @Override
    public void run() {
        synchronized (object) {
            for(int i=0;i<1000;i++) {
                a++;
            }
        }//结束
    }
}

现在我们使用synchronized关键字把这一块代码锁住,不管你怎么输出都是2000了,锁住之后,同一时刻只有一个线程进入。也就不会发生上面a写操作不同步的现象了。

现在相信你开始觉得synchronized关键字的确很实用,可以解决多线程中的很多问题。上面这个小例子只是带我们去简单的认识一下,我们可以参考动力节点在线的视频课程中举出的更多的例子,加深我们对synchronized关键字的理解。

0人推荐
共同学习,写下你的评论
0条评论
代码小兵498
程序员代码小兵498

153篇文章贡献528999字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消