0%

我们在使用锁时,线程获取锁是一种悲观锁策略,即假设每一次执行临界区代码都会产生冲突, 所以当前线程获取到锁的时候同时也会阻塞其他线程获取该锁。而CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有线程访问共享资源的时候不会出现冲突,既然不会出现冲突自然而然就不会阻塞其他线程的操作。因此,线程就不会出现阻塞停顿的状态。那么,如果出现冲突了怎么办?无锁操作是使用CAS(compare and swap)又叫做比较交换来鉴别线程是否出现冲突,出现冲突就重试当前操作直到没有冲突为止。

synchronized和ReentrantLock的区别

mark

先说说synchronized和ReentrantLock的区别吧,AQS的分析得等两天了:

1、ReentrantLock (再入锁),位于java.util.concurrent.locks包 2、和CountDownLatch、Future Task、Semaphore一样基于AQS实现 3、能够实现比synchronized更细粒度的控制,如控制公平与非公平 4、调用lock()之后,必须调用unlock()释放锁 5、性能未必比synchronized高,并且也是可重入的 6、synchronized是关键字,ReentrantLock是类 7、ReentrantLock可以对获取锁的等待时间进行设置,避免死锁的发生 8、ReentrantLock可以获取各种锁的信息 9、ReentrantLock可以灵活地实现多路通知 10、机制:sync操作Mark Word,lock调用Unsafe类的park()方法

本文主要讲述了synchronized的实现原理,还有synchronized的优化。其中主要包括了自适应自旋,锁消除、锁粗化、以及偏向锁和轻量级锁。另外阐述了锁的内存语义和对三种锁的总结。其实工程学科就是不断解决实际问题才能得以发展,synchronized从早期的一上来就直接使用Mutex逐步优化到现在的程度,mutex互斥量是最重要的同步原语,但是我们去使用mutex的时候却会出现诸多问题(比如销毁了已加锁的互斥量、死锁问题)Monitor机制是编程语言在语法上提供的语法糖,假设我们用的是C语言,那么很明显无法使用Monitor机制。

最近发现synchronized锁的是什么?甚至有人认为synchronized锁的是代码??!这个我觉得还是很有必要通过实际的示例来说明synchronized锁的到底是什么。

根据获取的锁的分类:获取对象锁和获取类锁!

获取对象锁的两种用法

1、同步代码块(synchronized(this), synchronized(类实例对象)),锁是小括号()中的实例对象。 2、同步非静态方法(synchronized method),锁是当前对象的实例对象。

获取类锁的两种用法

1、同步代码块(synchronized(类.class)),锁是小括号()中的类对象,即Class对象。 2、同步静态方法(synchronized static method),锁是当前对象的类对象(Class对象)。

mark

本文主要讲述了进程和线程发展简史,对于JVM来讲的进程和线程又是什么,Thread的start()方法的原生调用发生了什么,从而理解start()方法和run()方法有什么不同,另外,还介绍了三种处理线程执行完成后的返回值的方法,其实FutureTask和线程池获取线程执行结束的返回值更加常用。另外,介绍了线程的六种状态,还有sleep和wait的区别,notify和notifyAll的区别,yield函数的作用,以及如何优雅的中断线程等问题。

mark

OkHttp是一个优秀的网络请求框架,我开始接触Android开发的时候就用过这个网络请求框架,官方的参考文档在这里 https://square.github.io/okhttp/ ,本文演示了使用OkHttp框架进行简单的Get、Post(表单形式和JSON形式)、Delete、附加请求头、请求异步回调,文件的上传和下载等常用操作。最后记录了一个今天调试了很久的坑,那就是response.body().string()只能有效调用一次,注意Debug的时候对结果造成的改变!JDK9的HttpURLConnection有很多变化,下次博客中会有演示和说明。

mark

上图即使我搭建完毕的效果。对于Docker的环境安装,基础命令之类的内容,通读官网文档内容基本都能顺利掌握。 然而,当笔者尝试着搭建一套基于SSL的Docker Registry(官网推荐的做法)却遇到了不少的麻烦,对于这部分内容,大多数博客文档内容都是直接跳过了SSL的环节,采用了HTTP的访问形式。 然而本文就是记录一下对于搭建HTTPS 访问形式的Docker Registry的过程,读者很容易复现的过程!

我的环境是CentOS7_x64,Docker版本是 Client: Docker Engine - Community 19.03.7、Server: Docker Engine - Community 19.03.7、Nginx源码包的版本是nginx-1.9.9.tar.gz。

单例模式属于创建型设计模式,一个类在虚拟机中只有一份实例。实现单例模式的核心思想在于构造函数私有化,主要实现方式分为两种:懒汉式和饿汉式。

mark