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

绑定手机号,登录
手机号

验证码

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

验证码

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

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

深入浅出学习synchronized关键字

05-31 17:15 669浏览
举报 T字号
  • 大字
  • 中字
  • 小字

在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java1.6对synchronized进行了各种优化之后,它的性能就得到了很大的提升(从java1.8的ConcurrentHashMap底层就可以猜到,新版的synchronized性能真的不差!),Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁。

Synchronized一句话来解释其作用就是:能够保证同一时刻最多只有一个线程执行该段代码,以达到并发安全的效果。也就是说Synchronized就好比是一把锁,某个线程把资源锁住了之后,别人就不能使用了,只有当这个线程用完了别人才能用。对于Synchronized关键字来说,它是并发编程中一个元老级角色,也就是说你只要学习并发编程,就必须要学习Synchronized关键字。由此可见其地位。

synchronized 有三种方式来加锁,分别是

1.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁;

2.静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁;

3.修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码块前要获得给定对象的锁。 ps:不同的修饰,代表锁的控制粒度。

synchronized的应用:

public class Demo {
    private static int count = 0;

    public static void inc() {
        synchronized (Demo.class) {
            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            count++;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            new Thread(() -> Demo.inc()).start();
        }
        Thread.sleep(3000);
        System.out.println("运行结果" + count);
    }
}

在上边的代码中我们可以看到仅仅通过一个关键字就能够实现多线程的互斥,那么为了实现线程的互斥特性,需要哪些因素和信息?

  • 锁需要有一个标识来表示,比如的锁是什么状态,无锁还是有锁
  • 同时这个状态需要对多个线程共享

synchronized关键字贯穿了整个Java多线程的并发操作,想学好学精的小伙伴可以到动力节点在线观看免费的视频课程学习。

0人推荐
共同学习,写下你的评论
0条评论
杨晶珍
程序员杨晶珍

98篇文章贡献357785字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

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

取消