今天看了一片博文,讲Java多线程之线程的协作,当中作者用程序实例说明了生产者和消费者问题,但我及其它读者发现程序多跑几次还是会出现死锁,百度搜了下大都数的样例也都存在bug,经过细致研究发现当中的问题.并攻克了,感觉有意义贴出来分享下. 以下首先贴出的是有bug的代码,一个4个类.Plate.java: package CreatorAndConsumer; import java.util.ArrayList; import java.util.List; /** * 盘子,表示共享的资源…
在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: package com.jikexueyuan.thread; /* * 未使用synchronized,存在并发 */ class RunnableDemo implements Runnable{ private int tickets = 5; @Override public void run() { for (int i = 0; i <…
在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: package com.jikexueyuan.thread; /* * 未使用synchronized,存在并发 */ class RunnableDemo implements Runnable{ private int tickets = 5; @Override public void run() { for (int i = 0; i <…
学习之前,先了解线程状态图 说明:线程共包括以下5种状态. 1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable): 也被称为“可执行状态”.线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行. 3. 运行状态(Running) : 线程获取CPU权限进行执行.需…
一. Java线程具有6种状态  NEW 初始状态,线程被创建,但是还没有调用start方法. RUNNABLE 运行状态,java线程将操作系统中的就绪和运行两种状态笼统的称作进行中. BLOCKED 阻塞状态,表示线程阻塞于锁. WAITING 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些其它动作 TIME_WAITING 超时等待状态,该状态不同于WAITING,它是可以在指定的时间自动返回的 TERMINATED 终止状态,表示当前线程已经执行完毕 二.…
详细代码在文章底部 目录 基础概念 进程与线程 单线程与多线程 实现线程的4中方式 thread.start()和runnable.run()的区别 Thread和Runnable的异同 线程的基本操作 线程的优先级与守护线程 synchronized关键字 实例锁与全局锁 wait和notify 线程的让步yeild 线程的休眠sleep Thread中的join 线程的中断interrupt 线程的状态与转换 生产者消费者问题 钩子线程 线程中的异常 基础概念 进程与线程 进程(Proces…
Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁代码谈一下volatile关键字 Java多线程编程-(4)-线程本地ThreadLocal的介绍与使用 Java多线程编程-(5)-线程间通信机制的介绍与使用 Java多线程编程-(6)-你还在使用wait/notify实现进程间的通信吗? Java多线程编程-(7)-使用ReentrantRea…
本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别       synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized…
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等方案后,问题得到解决. 限流方案见本人另一篇博客:Guava-RateLimiter实现令牌桶限流 加锁方案见下文. 二.乐观锁 & 悲观锁 1.乐观锁   顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版…
Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线程共同操作这些共享数据 解决问题的根本方法是,在同一时刻有且只有一个线程在操作共享数据,其他数据必须等到该线程处理完数据后再对共享数据进行操作 此时就引入了互斥锁,互斥锁的特性有互斥性(即同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程的协调机制,这样在同一时间只有一个线程对需要同步的…