synchronized

java 23种设计模式

可紊 提交于 2020-03-18 11:43:43
设计模式(Design Patterns) ——可复用面向对象软件的基础 设 计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用 设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决 方案,这也是它能被广泛应用的原因。本章系 Java之美[从菜鸟到高手演变]系列 之设计模式,我们会以理论与实践相结合的方式来进行本章的学习,希望广大程序爱好者,学好设计模式,做一个优秀的软件工程师! 在阅读过程中有任何问题,请及时联系:egg。 邮箱:xtfggef@gmail.com 微博: http://weibo.com/xtfggef 如有转载,请说明出处: http://blog.csdn.net/zhangerqing 企业级项目实战(带源码)地址 : http://zz563143188.iteye.com/blog/1825168 23种模式java实现源码 收集五年的开发资料下载地址 : http://pan.baidu

Java_14:多线程高阶

喜夏-厌秋 提交于 2020-03-17 22:28:35
一、多线程 1.为什么使用多线程: (1)安全 (2)效率 2.多线程使用场景: (1)需要执行比较耗时的操作 (2)需要异步处理的业务(比如阻塞) 3.使用多线程要考虑的因素: (1)执行的代码任务量 (2)系统资源 (3)执行任务的数量 二、线程间竞争对象锁的过程 三、synchronized关键字 1.synchronized的作用: 通过线程间的同步互斥达到线程安全的三大特性(原子性、可见性、有序性) 2.synchronized执行效率: (1)如果线程数量越多,性能下降的越快 (2)同步代码执行时间越快。性能相对来说,下降越快 3.synchronized实现原理: monitor机制:monitorenter、monitorexit,计数器 4.synchronized的锁机制: (1)乐观锁: (2)悲观锁: (3)CAS Compare and Swap,比较并交换(原始值、修改值、预期值、版本号)---属于乐观锁 CAS的应用: java.util.concurrent.atomic的实现原理就是CAS 5.synchronized的优化方案: 来源: 51CTO 作者: 小西几 链接: https://blog.51cto.com/14234228/2479527

Java_14:多线程高阶

别来无恙 提交于 2020-03-17 22:27:57
一、多线程 1.为什么使用多线程: (1)安全 (2)效率 2.多线程使用场景: (1)需要执行比较耗时的操作 (2)需要异步处理的业务(比如阻塞) 3.使用多线程要考虑的因素: (1)执行的代码任务量 (2)系统资源 (3)执行任务的数量 二、线程间竞争对象锁的过程 三、synchronized关键字 1.synchronized的作用: 通过线程间的同步互斥达到线程安全的三大特性(原子性、可见性、有序性) 2.synchronized执行效率: (1)如果线程数量越多,性能下降的越快 (2)同步代码执行时间越快。性能相对来说,下降越快 3.synchronized实现原理: monitor机制:monitorenter、monitorexit,计数器 4.synchronized的锁机制: (1)乐观锁: (2)悲观锁: (3)CAS Compare and Swap,比较并交换(原始值、修改值、预期值、版本号)---属于乐观锁 CAS的应用: java.util.concurrent.atomic的实现原理就是CAS 5.synchronized的优化方案: 来源: 51CTO 作者: 小西几 链接: https://blog.51cto.com/14234228/2479528

java

守給你的承諾、 提交于 2020-03-17 13:24:28
1、CAS Conmpare And Swap比较和交换,主要用于多个线程对共享内存的变量(全局变量)操作时的线程安全问题。它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。这是作为单个原子操作完成的。 一个 CAS 涉及到以下操作 我们假设内存中的原数据V,旧的预期值A(线程从共享内存中取出的数据),需要修改的新值B。 比较 A 与 V 是否相等。(比较) 如果比较相等,将 B 写入 V。(交换) 返回操作是否成功。 当多个线程同时对某个资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。可见 CAS其实是一个乐观锁。 下图中,主存中保存V值,线程中要使用V值要先从主存中读取V值到线程的工作内存A中,然后计算后变成B值,最后再把B值写回到内存V值中。多个线程共用V值都是如此操作。CAS的核心是在将B值写入到V之前要比较A值和V值是否相同,如果不相同证明此时V值已经被其他线程改变,重新将V值赋给A,并重新计算得到B,如果相同,则将B值赋给V。 ABA 问题 CAS 由三个步骤组成,分别是“读取->比较->写回”。 考虑这样一种情况,线程1和线程2同时执行 CAS 逻辑,两个线程的执行顺序如下: 时刻1:线程1执行读取操作,获取原值 A,然后线程被切换走 时刻2:线程2执行完成 CAS

线程同步synchronized

六眼飞鱼酱① 提交于 2020-03-17 11:41:01
同步条件:等待池序列,锁机制。 由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突的问题。为了保证数据在方法中被访问时的正确性,在访问时加入锁机制(synchronized),当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可。存在以下问题: 一个线程持有锁会导致其它所有需要此锁的我程挂起; 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题: 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能问题。 可以 修饰方法或者代码块 ,确保多个线程在同一时刻,只能有一个线程处理方法或者是同步块,Synchronized修饰的方法或者代码块相当于并发中的临界区,在同一时刻JVM只允许一个线程进入执行。 保证线程对访问变量的可见性,有序性,原子性 。 修饰普通方法 修饰静态方法 修饰代码块 通过synchronized关键字来处理统计1秒钟count++的次数 public class SynchronizedDemo { private static boolean flag = true; public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public

Synchronizing a Method Across JVM's

天大地大妈咪最大 提交于 2020-03-17 08:45:09
问题 How does one go about synchronizing a method across JVM's? My example is a web application that restricts a user name from being logged in more than once (in other words, the first user can log on, but if another user signs on with the same user name, he gets rejected). The web application is deployed across multiple servers, so there are multiple JVM's, and users can be attempting to sign on using different servers, depending on the load balancer. Here's how the method looks public

关于Java变量的可见性问题

你离开我真会死。 提交于 2020-03-16 11:54:15
某厂面试归来,发现自己落伍了!>>> 关于Java变量的可见性问题 博文前提 最近在oschina问答板块看到了一个关于java变量在工作内存和主存中的可见性问题: synchorized,sleep 也能达到volatile 线程可见性的目的? ,大致的问题描述如下: package com.test; import java.util.concurrent.TimeUnit; public class test1 { private static boolean is = true; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { int i = 0; while(test1.is){ i++; 1 //synchronized (this) { } 会强制刷新主内存的变量值到线程栈? 2 //System.out.println("1"); println 是synchronized 的,会强制刷新主内存的变量值到线程栈? 3 //sleep 会从新load主内存的值? // try { // TimeUnit.MICROSECONDS.sleep(1); // }catch (InterruptedException e) {

Java 修饰符

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-16 03:20:55
访问修饰符 Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。 默认的,也称为default,在同一包内可见,不使用任何修饰符。 私有的,以private修饰符指定,在同一类内可见。 共有的,以public修饰符指定,对所有类可见。 受保护的,以protected修饰符指定,对同一包内的类和所有子类可见。 非访问修饰符 static修饰符 静态变量: static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。静态变量也被称为类变量。局部变量不能被声明为static变量。 静态方法: static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。 fianl修饰符 final变量: final变量能被显式地初始化并且只能初始化一次。被声明为final的对象的引用不能指向不同的对象。但是final对象里的数据可以被改变。也就是说final对象的引用不能改变,但是里面的值可以改变。 final修饰符通常和static修饰符一起使用来创建类常量。 final方法: 类中的Final方法可以被子类继承,但是不能被子类修改。 final类: final类不能被继承 abstract修饰符 抽象类: 抽象类不能用来实例化对象

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

二次信任 提交于 2020-03-16 02:26:09
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,因为当它消耗掉某些数据后缓冲区不再为满。 我们可以利用wait()来让一个线程在某些条件下暂停运行。例如,在生产者消费者模型中,生产者线程在缓冲区为满的时候,消费者在缓冲区为空的时候,都应该暂停运行。如果某些线程在等待某些条件触发,那当那些条件为真时,你可以用 notify 和 notifyAll 来通知那些等待中的线程重新开始运行。不同之处在于,notify 仅仅通知一个线程,并且我们不知道哪个线程会收到通知,然而 notifyAll 会通知所有等待中的线程。换言之,如果只有一个线程在等待一个信号灯,notify和notifyAll都会通知到这个线程。但如果多个线程在等待这个信号灯,那么notify只会通知到其中一个,而其它线程并不会收到任何通知,而notifyAll会唤醒所有等待中的线程。 在这篇文章中你将会学到如何使用

to meet you Java多线程与并发

家住魔仙堡 提交于 2020-03-14 18:46:59
2: hotspot中对象在内存的布局是分3部分 对象头 实例数据 对其填充 这里主要讲对象头:一般而言synchronized使用的锁对象是存储在对象头里的,对象头是由Mark Word和Class Metadata Address组成 mark word存储自身运行时数据,是实现轻量级锁和偏向锁的关键,默认存储对象的hasCode、分代年龄、锁类型、锁标志位等信息。 由于对象头的信息是与对象定义的数据没有关系的额外存储成本,所以考虑到jvm的空间效率,mark word 被设计出一个非固定的存储结构,以便存储更多有效的数据,它会根据对象本身的状态复用自己的存储空间(轻量级锁和偏向锁是java6后对synchronized优化后新增加的) Monitor:每个Java对象天生就自带了一把看不见的锁,它叫内部锁或者Monitor锁(监视器锁)。上图的重量级锁的指针指向的就是Monitor的起始地址。 每个对象都存在一个Monitor与之关联,对象与其Monitor之间的关系存在多种实现方式,如Monitor可以和对象一起创建销毁、或当线程获取对象锁时自动生成,当线程获取锁时Monitor处于锁定状态。 Monitor是虚拟机源码里面用C++实现的 源码解读:_WaitSet 和_EntryList就是之前学的等待池和锁池,_owner是指向持有Monitor对象的线程