Java并发之synchronized实现原理

线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。

时间就是你的命

涛哥前段时间送了我一本签名版的《一年顶十年》,彪悍一只猫的新书,那一看就让人上头的红色封面,就跟涛哥他巨豪爽的性格一样,喜欢得不得了。 写一本这么受欢迎的讲道理的书,很难!巨难!...

从罗永浩身上,学增长

  现在这么难的环境,还能谈「增长」吗?   今年恐怕谈“怎么活下来”的企业,比谈“怎么增长”的企业要多得多。   “战争以一方失去战斗意志为结束”   活着,是创业者今年每天都要面对的...

等待唤醒机制与synchronized

所谓等待唤醒机制前几篇讲的是notify/notifyAll和wait方法,在使用这3个方法时,必须处于synchronized代码块或者synchronized方法中,否则就会抛出IllegalMonitorStateException异常,这是因为...

那让人生生死死的「生态位」

所有做过公司的人,其实都想上市,都想去敲钟,谁不想呀,是吧? 但又有多少家,能好好活着,哪怕xiao微有一丢丢盈利呢…… 对了,公司能不能上市应该和「天时、地利、人和」有关,这也是很多人...

线程中断与synchronized

事实上线程的中断操作对于正在等待获取的锁对象的synchronized方法或者代码块并不起作用,也就是对于synchronized来说,如果一个线程在等待锁,那么结果只有两种,要么它获得这把锁继续执行,要么它就保存等待,即使调用中断线程的方法,也不会生效。

synchronized的可重入性

从互斥锁的设计上来说,当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,这种情况属于重入锁,请求将会成功,在java中synchronized是基于原子性的内部锁机制,是可重入的,因此在一个线程调用synchronized方法的同时在其方法体内部调用该对象另一个synchronized方法,也就是说一个线程得到一个对象锁后再次请求该对象锁,是允许的,这就是synchronized的可重入性。

Java虚拟机对synchronized的优化

锁的状态总共有四种,无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁,但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级,关于重量级锁,前面我们已详细分析过,下面我们将介绍偏向锁和轻量级锁以及JVM的其他优化手段,这里并不打算深入到每个锁的实现和转换过程更多地是阐述Java虚拟机所提供的每个锁的核心优化思想,毕竟涉及到具体过程比较繁琐,如需了解详细过程可以查阅《深入理解Java虚拟机原理》。

synchronized方法底层原理

方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。

synchronized代码块底层原理

现在重新定义一个synchronized修饰的同步代码块,在代码块中操作共享变量i,如下

理解Java对象头与Monitor

在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。

synchronized的三种应用方式

synchronized关键字最主要有以下3种应用方式,下面分别介绍:修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁;修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁;修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

三种避免死锁的思路

死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。

Kafka源码深度剖析——KafkaProducer最终如何处理响应

上一小节我们分析了kafkaProducer端接受到Broker返回来的响应以后对响应消息的一系列的处理。这一小节我们就看一下对响应消息的终极处理。

Java数据库学习汇总

Java数据库学习汇总

Java数据库学习 | MyBatis框架

MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。

Java数据库学习 | Hibernate框架

对象关系映射(ORMapping),是软件开发过程中,在数据库层比较流行的设计思想。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Java数据库学习 | JDBC编程

JDBC(Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

Java数据库学习 | MySQL基本使用

关系型数据库MySQL在现在使用还是比较广泛的,我们平时进行基本的开发时可以安装这个数据库来使用,安装完成后可以使用Navicat来对数据库进行操作。

Java数据库学习 | 数据库相关理论

在数据库中,数据不再以各个应用程序各自的要求来分别存储,而是把整个系统所有的数据,根据它们之间固有的关系,分门别类地加以存储。也就是说,数据库是存储在计算机系统内的结构化的、集成的、相关的、共享的和可控制的数据集合。