多线程与并发编程
文章平均质量分 56
多线程与并发编程
呢喃coding
个人邮箱 : 1425809544@qq.com
手机号 : 13269918057
微信号 : wangzhezhilv0
展开
-
java中锁的基本原理和升级:偏向锁、轻量级锁、重量级锁
目录由一个问题引发的思考多线程对于共享变量访问带来的安全性问题线程安全性思考如何保证线程并行的数据安全性synchronized 的基本认识synchronized 的基本语法synchronized 的应用思考锁是如何存储的对象在内存中的布局为什么任何对象都可以实现锁synchronized 锁的升级锁的种类偏向锁偏向锁的获取偏向锁的撤销轻量级锁轻量级锁的加锁**自旋锁**轻量级锁的解锁重量级锁重量级锁的 monitor重量级锁的加锁回顾线程的竞争机制**偏向锁**轻量级锁重量级锁Synchronized原创 2022-01-16 16:52:22 · 2226 阅读 · 0 评论 -
多线程文件下载简单实现(1)
1.Connection接口public interface Connection { /** * @Author xuyangyang * @Describe 给定开始和结束位置, 读取数据, 返回值是字节数组 * @Date 2017/6/7 * @Params * @Return */ byte[] read(i原创 2017-06-07 11:28:49 · 358 阅读 · 1 评论 -
多线程文件下载简单实现(2)
1.下载监听器,用于监听文件是否下载完成public interface DownloadListener { void notifyFinished();}2.下载线程类public class DownloadThread extends Thread { Connection conn; int startPos; int endPos; Cycli原创 2017-06-07 15:33:02 · 308 阅读 · 0 评论 -
分布式环境如何解决唯一主键问题?
基于数据库如果用最简单的方式来生成唯一主键,可以怎么做呢?一个最直接的方案是使用单独的自增数据表,存储拆分以后,创建一张单点的数据表,比如现在需要生成订单 ID,我们创建下面一张数据表:```CREATE TABLE IF NOT EXISTS order_sequence( order_id INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY ( order_id ))ENGINE=InnoDB DEFAULT CHARSET=utf8;当每次需要生成唯原创 2022-03-28 16:56:48 · 786 阅读 · 0 评论 -
三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串
1、使用 lock锁public class ThreeThreadPrint { //三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串 private static ReentrantLock lock = new ReentrantLock(); private static volatile int state = 0; private static volatile int n = 2;原创 2022-03-19 11:15:05 · 606 阅读 · 0 评论 -
两个线程交替打印1-100
1、使用synchronize 的wait 和notify 控制 //private static volatile int total = 100; private static volatile int count = 1; private static Object object = new Object(); private static void useSyn() { Thread t1 = new Thread(() -> {原创 2022-03-19 07:32:42 · 693 阅读 · 0 评论 -
Java内存模型
为什么定义Java内存模型?现代计算机体系大部是采用的对称多处理器的体系架构。每个处理器均有独立的寄存器组和缓存,多个处理器可同时执行同一进程中的不同线程,这里称为处理器的乱序执行。在Java中,不同的线程可能访问同一个共享或共享变量。如果任由编译器或处理器对这些访问进行优化的话,很有可能出现无法想象的问题,这里称为编译器的重排序。除了处理器的乱序执行、编译器的重排序,还有内存系统的重排序。因此...原创 2019-06-27 15:01:16 · 101 阅读 · 0 评论 -
Java进程内存分析
ps aux命令执行结果的几个列的信息的含义USER 进程所属用户PID 进程ID %CPU 进程占用CPU百分比%MEM 进程占用内存百分比VSZ 虚拟内存占用大小 单位:kb(killobytes)RSS 实际内存占用大小 单位:kb(killobytes)TTY 终端类型STAT 进程状态START 进程启动时...转载 2019-07-05 10:38:34 · 1469 阅读 · 0 评论 -
jvm相关资料收集
Java SPI思想梳理原创 2022-01-12 20:35:34 · 152 阅读 · 0 评论 -
HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
这篇文章讲的已经很详细了,我暂时没有时间在写一遍,最主要的是自己要简单的实现一遍,根据其中的思想,重新写一个简单的hashMap,可以加深对它的理解HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!...转载 2019-06-25 10:40:03 · 299 阅读 · 0 评论 -
jvm gc日志分析和工具
目录Gc优化垃圾收集发生的时机GC日志文件Parallel GC日志CMS日志G1日志Gc日志分析文件在线gceasypso-gc.logcms-gc.logg1-gc.log离线GCviewerGc优化内存被使用了之后,难免会有不够用或者达到设定值的时候,就需要对内存空间进行垃圾回收。垃圾收集发生的时机GC是由JVM自动完成的,根据JVM系统环境而定,所以时机是不确定的。 当然,我们可以手动进行垃圾回收,比如调用System.gc()方法通知JVM进行一次垃圾回收,但是具体什么时刻运行也无法控制原创 2022-01-11 20:29:43 · 2008 阅读 · 0 评论 -
多线程(二)生命周期
多线程(二)生命周期线程状态 :新建状态(new):使用new创建一个线程对象,仅仅在堆中分配内存空间,在调用start方法之前.新建状态下,线程压根就没有启动,仅仅只是存在一个线程对象而已.Thread t = new Thread();//此时t就属于新建状态当新建状态下的线程对象调用了start方法,此时从新建状态进入可运行状态.线程对象的start方法只能调用原创 2018-01-05 14:12:57 · 158 阅读 · 0 评论 -
多线程(一) 基本概念
进程是什么? 进程是指一个内存中运行中的应用程序。每个进程都有自己独立的一块内存空间,一个应用程序可以同时启动多个进程。比如在Windows系统中,一个运行的abc.exe就是一个进程;线程是什么?线程是指进程中的一个执行任务(控制单元),一个进程可以同时并发运行多个线程;进程和线程的区别?进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程;原创 2018-01-05 10:04:58 · 259 阅读 · 0 评论 -
多线程(三)--实现多线程的两种方式
Thread和Runnable简介Runable是一个接口,里面只有一个方法,启动多线程只需要实现这个接口,通过new Thread(new A())等方式新建线程public interface Runnable { public abstract void run(); }Thread是一个类,其实这个类本身实现了runable接口的原创 2018-01-08 16:15:52 · 208 阅读 · 0 评论 -
二、怎么停止一个java线程
1. 错误的停止方式stop()(已经废弃)原因是stop会在线程没有执行完的时候强行停止线程,清除监视器锁的信息,如果一个线程计算一项工作完成一半突然停止,有可能导致数据不一致,与我们的期望不一致,可能导致线程安全问题package com.example.thread;public class StopThread extends Thread { private int i = 0, j = 0; @Override public void run() {原创 2020-06-10 10:01:33 · 140 阅读 · 0 评论 -
两种方法判断线程池停止?
目录一、 ExecutorService 自身方法二、CountDownLatch类一、 ExecutorService 自身方法使用 threadPoll.shutdown()和 threadPoll.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);配合package com.example.thread.threadlocal.scene1;import java.text.SimpleDateFormat;import原创 2020-06-02 15:26:48 · 1343 阅读 · 0 评论 -
为什么局部变量是线程安全的?
1. 方法是如何被执行的?//斐波那契数列:1、1、2、3、5、8、13、21、34第一项和第二项是1,第三项开始,每一项是前两项的和int a=7;int [] b = fibonacci(a);int [] c =b;当你调用fibonacci(a)的时候,cpu要先找到fibonacci()的地址,然后跳转到这个地址去执行代码,最后,cpu执行完fibonacci()后,要能够返...原创 2019-09-17 14:51:28 · 3211 阅读 · 0 评论 -
Future:如何用多线程实现最优的“烧水泡茶”程序?
# 下面的示例代码就是Future特性来实现最优的“烧水泡茶”程序首先,我们创建了两个FutureTask——ft1和ft2,ft1完成洗水壶、烧开水、泡茶的任务,ft2完成洗茶壶、洗茶杯、拿茶叶的任务;这里需要注意的是ft1这个任务在执行泡茶任务前,需要等待ft2把茶叶拿来,所以ft1内部需要引用ft2,并在执行泡茶之前,调用ft2的get()方法实现等待。测试如何使用FutureTask...原创 2019-06-12 10:30:24 · 871 阅读 · 0 评论