Java并发关键字-synchronized,zookeeper入门教程

本文深入探讨了Java并发编程的关键字`synchronized`,包括对象锁(monitor)机制、synchronized的happens-before关系、锁获取和释放的内存语义以及在Java对象头中的实现。此外,还介绍了CAS操作及其应用场景和问题,以及Java锁的优化,如偏向锁和轻量级锁。最后,提到了Zookeeper作为分布式协调服务的入门概念。
摘要由CSDN通过智能技术生成
  • Java对象头

  • 偏向锁

  • 轻量级锁

  • 各种锁的比较

  • 一个例子

synchronized简介


在学习知识前,我们先来看一个现象:

public class SynchronizedDemo implements Runnable {

private static int count = 0;

public static void main(String[] args) {

for (int i = 0; i < 10; i++) {

Thread thread = new Thread(new SynchronizedDemo());

thread.start();

}

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("result: " + count);

}

@Override

public void run() {

for (int i = 0; i < 1000000; i++)

count++;

}

}

开启了10个线程,每个线程都累加了1000000次,如果结果正确的话自然而然总数就应该是10 * 1000000 = 10000000。可就运行多次结果都不是这个数,而且每次运行结果都不一样。这是为什么了?有什么解决方案了?这就是我们今天要聊的事情。

在上一篇博文中我们已经了解了Java内存模型的一些知识,并且已经知道出现线程安全的主要来源于JMM的设计,主要集中在主内存和线程的工作内存而导致的内存可见性问题,以及重排序导致的问题,进一步知道了happens-before规则。线程运行时拥有自己的栈空间,会在自己的栈空间运行,如果多线程间没有共享的数据也就是说多线程间并没有协作完成一件事情,那么,多线程就不能发挥优势,不能带来巨大的价值。那么共享数据的线程安全问题怎样处理?很自然而然的想法就是每一个线程依次去读写这个共享变量,这样就不会有任何数据安全的问题,因为每个线程所操作的都是当前最新的版本数据。那么,在Java关键字synchronized就具有使每个线程依次排队操作共享变量的功能。很显然,这种同步机制效率很低,但synchronized是其他并发容器实现的基础,对它的理解也会大大提升对并发编程的感觉,从功利的角度来说,这也是面试高频的考点。好了,下面,就来具体说说这个关键字。

synchronized实现原理


在Java代码中,synchronized可使用在代码块和方法中,根据synchronized用的位置可以有这些使用场景:

在这里插入图片描述

如图,synchronized可以用在方法上也可以使用在代码块中,其中方法是实例方法和静态方法分别锁的是该类的实例对象和该类的对象。而使用在代码块中也可以分为三种,具体的可以看上面的表格。这里的需要注意的是:如果锁的是类对象的话,尽管new多个实例对象,但他们仍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值