
java
文章平均质量分 63
郭梧悠
史上最菜程序员
展开
-
Java多线程为什么使用while循环来调用wait方法
Java多线程为什么使用while循环来调用wait方法?《java并发编程实战》一书第14章列出了详细的原因(多看书还是会有收获滴),在此总结下来。示例代码://示例代码,从队列中获取元素public synchronized void put(V v) throws InterruptedExcetpion{ //不能使用if(isFull) while(isFull()){ wait(); } doPut(v) notivyALl();}详细原因博主梳理如下:原创 2021-12-11 15:24:49 · 756 阅读 · 0 评论 -
Java并发编程实战读书笔记之死锁
死锁的分类前言一、锁顺序死锁二、动态的锁顺序死锁。前言本篇学习笔记源自于《Java并发编程实战》第10章。提示:以下是本篇文章正文内容,下面案例可供参考一、锁顺序死锁看下面代码,很容易造成死锁,leftRight和rightLeft方法分别获取了left和right锁,只不过二者获取锁的顺序是相反的。那么如果一个Thread调用了leftRight,另一个Thread调用了rightLeft,并且两个Thread的操作是交错执行的,那么就容易发生时所。class LeftRightDead原创 2021-11-27 10:06:52 · 324 阅读 · 0 评论 -
Java并发编程实战之基于生产者消费者模式的日志服务读书笔记
public class LogService { private final BlockingDeque<String> queue; private final LoggerThread loggerThread; public LogService(PrintWriter writer) { queue = new LinkedBlockingDeque<>(); loggerThread = new LoggerThr原创 2021-11-06 16:59:58 · 362 阅读 · 0 评论 -
java并发编程实战读书笔记 ExecutorCompletionService
当我们向Executor提交一组任务,并且希望任务在完成后获得结果,此时可以考虑使用ExecutorCompletionService。ExecutorCompletionService实现了CompletionService接口。ExecutorCompletionService将Executor和BlockingQueue功能融合在一起,使用它可以提交我们的Callable任务。这个任务委托给Executor执行,可以使用ExecutorCompletionService对象的take和poll方法获原创 2021-11-01 10:35:13 · 295 阅读 · 0 评论 -
java并发编程实战读书笔记4--生产者消费者模式和队列
1、BlockingQueue简化了生产者-消费者设计的实现过程,支持任意数量的生产者和消费者。常见的实现就是线程池与工作队列的组合,在Executor任务执行框架中就体现了这种模式。2、在构建高可靠的应用程序时,有界队列是一种强大的资源管理工具:它能抑制并防止产生过多的工作项,使应用程序在负荷过载的情况下变得更加健壮。3、生产者-消费者模式能够将生产者和消费者的代码彼此解耦,但是他们的行为仍然会通过共享工作队列耦合在一起。4、LinkedBlockingQueue和ArrayBlockingQueu原创 2021-10-19 21:13:47 · 364 阅读 · 0 评论 -
java并发编程实战读书笔记3
1、ConcurrentModificationException 当容器在迭代过程中被其他线程修改时,就会抛出该异常。想要避免该以后该异常,就需要在迭代的过程中持有该容器的锁。但是长时间持有容器的锁会降低程序的可伸缩性,持有锁的时间越长,那么该锁的竞争就会越激烈,就会降低吞吐量和CPU的利用率。也可以克隆容器,在副本上操作避免出现此异常。比如Vector和Hashtable就可能抛出该异常。2、Queue用来临时保存一组等待处理的元素,在Queue上操作不会阻塞。而BlockingQueue则扩展了Qu原创 2021-09-26 16:17:41 · 135 阅读 · 1 评论 -
java并发编程实战读书笔记2
1、volatile ,是一种比sychronized关键字更轻量级的同步机制,在访问volatile变量时因为不会执行加锁操作,所以不会导致线程阻塞。volatile变量也有局限性,比如它不足以确保递增操作(++)的原子性。该变量通常用作某个操作完成,发生中断或者状态的标志。典型用法如下:volatile bolean asleep;while(asleep){ countSomeSheep();}加锁机制既可以确保可见性又可以确保原子性,而volatitle变量只能确保可见性,在读原创 2021-09-11 13:46:03 · 167 阅读 · 0 评论 -
Java并发编程实战读书笔记(1)
1、无状态对象一定是线程安全的。因为无状态的对象不包含任何变量或者其他类的引用。2、在某线程修改某变量的时候,需要通过某种方式,比如加锁,来防止其他线程使用该变量。3、在java.util.concurrent包含了一些县城安全的对象,比如AtomicLong.在实际情况中,尽可能低使用现有的线程安全对象。避免重复造轮子。4、每个java对象都有一个实现同步的锁,被称为内置锁,它是可以重入的,也就是说一个线程试图获取一个已经由他自己持有的锁,那么这个请求就会成功。关于重入锁,可以简单的阅读博主的Jav原创 2021-09-08 21:39:57 · 195 阅读 · 0 评论 -
Java 线程池 ThreadPoolExecutor源码简析
如果你对线程池的概念还不甚了解,那么Java 线程池 Executor浅入浅出这篇文章可以让你一步步从0到1了解线程池的搭建过程。在Executors中为我们提供了多种静态工厂方法来创建各种特性的线程池,其中大多数是返回ThreadPoolExecutor对象。因此本篇博文直接对ThreadPoolExecutor的原理进行剖析,加深对线程池设计的理解。ThreadPoolExecutor有如下两个重要参数:corePoolSize线程池核心线程的数量。如果线程池里得线程个数小于corePoolSiz原创 2021-08-14 13:06:21 · 266 阅读 · 0 评论 -
图片版坦克大战游戏项目说明
如果有人想要该项目图片的话请邮件feixiangdebaiyun@yeah.net原创 2012-02-23 07:53:13 · 1991 阅读 · 0 评论 -
坦克大战之声音处理类(四)
package music;import java.io.File;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.Clip;import javax.sound.sampled.DataLi原创 2012-02-22 23:10:09 · 2841 阅读 · 0 评论 -
图片版坦克大战其他相关的 类(三)
package imageban;/** * 该枚举类定义了坦克,子弹运动的方向 * @author dell * */public enum Direction {/** 从左到右一次是* 左 ,上,,右,,下,,停止*/L, U, R, D, STOP }*************************************原创 2012-02-22 22:26:11 · 1603 阅读 · 0 评论 -
图片版坦克大战源代码之坦克类(二)
package imageban;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.io.IOException;import java.util.ArrayList;import tankImage.ImageUtil;/** * 抽象的原创 2012-02-22 22:22:37 · 5395 阅读 · 0 评论 -
图片版坦克大战源代码之图片处理类(一)
package tankImage;import java.awt.Image;import java.io.IOException;import java.util.ArrayList;/** * 存储图片的类,把图片放到ArrayList里面, * 之所以把图片存储起来,是为了避免频繁的文件读取工作 * 这个有三个子类,分别是代表我方坦克图片的MyImage类,原创 2012-02-22 22:15:55 · 1842 阅读 · 0 评论 -
桌面弹球游戏终结,含有全部代码
桌面弹球游戏制作总结1 创建游戏对象本人在做这个游戏时,没有完全按照书上的做法来做,相反的是我根据以前做过的坦克大战游戏思路对类的具体实现及其设计做了很大的改动并纠正书上明显的错误之处,有幸的是游戏可以运行,不免小小激动了一下,但当挡板吃掉道具时还有一部分小问题,就是当吃了道具以后变长,当在吃另一个变长的道具是就没有反应,问题是由于在处理道具的时候增加了一条if判断语句,但是本人改了半天仍原创 2011-07-12 22:27:18 · 6437 阅读 · 0 评论 -
单机俄罗斯方块游戏制作心得(四)
下面说的是游戏工具界面的搭建。在MainFrame里定义下面属性private GamePanel gamePanel; //级别 private JLabel levelTextLabel = new JLabel("级别"); private JLabel levelLabel = new JLabel(); private Box levelTextBox = Box.c原创 2011-04-13 22:29:00 · 2295 阅读 · 2 评论 -
制作单机俄罗斯游戏心得(三)
到目前为止,Piece对象也创建好了,所以“物资”齐全,该准备登上游戏的舞台———MainFrame中了,要想让物快在舞台上表演,得有”演员“在”舞台"上啊.所以,在MainFrame中提供了表示当前正在运动的Piece对象的引用currentPiece和下一个方块的引用nextPiece private Piece currentPiece; private Piece nextPiec原创 2011-04-13 21:40:00 · 1556 阅读 · 0 评论 -
制作单机俄罗斯方块游戏心得(二)
前面说的是创建了Piece0, Piece1,Piece2,Piece3,Piece4,Piece5,Piece6.其中变化的方块,由于游戏开始和下一个方块出现时是随机得到不同的大方块的,在定义Piece时用changes属性(Protectec List> changes = new ArrayList>())来储存变化的方块,所以要想随机的到一个方块,在Piece提供了一个geDefault原创 2011-04-12 22:55:00 · 2772 阅读 · 0 评论 -
制作单机俄罗斯方块游戏总结(一)
序言 声明一下:本人是java初学者,所以这个游戏的代码大部分是由我买的>面的, 当然也有我自己的心血在里面.当初最初自己按照书上的思路做这个游戏(没有看作者的代码),走了不少的弯路. 做完这个游戏,收获颇多,感觉有必要总结一下自己的学习心得和分享一下自己的一点儿经验.前面已经提到自己是个初学者,如果有不当之处和理解错误的地方.在所难免,真诚地希望看到此文的朋友给以指点和原创 2011-04-12 08:03:00 · 4515 阅读 · 0 评论 -
Java线程拾遗(可重入锁)
对于锁的可重入锁来说,意味着某线程获取锁之后,该线程就可以进入任何一个该锁所同步着的代码块!!!先举一个反面例子,非可重入锁!Java提供的sun.misc.Lock就是典型的非可重入锁。通过其源码可以看出来:public class Lock { private boolean locked = false; //获取锁,获取成功之后设置locked=true public final...原创 2019-10-30 11:44:30 · 520 阅读 · 0 评论 -
java线程知识点拾遗(排队CAS)
在java线程知识点拾遗(CAS)这篇文章中简单的介绍了cas的概念,但是普通的cas是有一个非公平的问题,多个线程需要共享资源的时候可能造成忙等待问题,一言以蔽之就是可能后请求共享资源的线程可能比先请求资源的线程优先获取到资源。用个例子来说明cas的非公平性,代码如下:public class UnFairCasLock implements Runnable { private Atom...原创 2019-08-28 15:16:52 · 495 阅读 · 2 评论 -
java线程知识点拾遗(CAS)
CAS:简单的来说就是比较交换!那么比较的是什么?交换的又是什么呢?CAS有三个操作数,V,A,B。要比较的就是V和A,当V和A相等的时候,就将V的值更新为B.感觉就像“天王盖地虎”对“小鸡炖蘑菇”一样,暗号对上了(V==A)就可以进行下一步的操作(更新)了上面这段描述可以简单的伪代码表示为:if(V==A){ V=B;}当然这并没有体现出自旋的特性,将上面的这段伪代码用一个方...原创 2019-08-19 15:33:00 · 787 阅读 · 1 评论 -
Java 线程池 Executor浅入浅出
基础无论什么时候都是很重要的,为了防止长期也业务代码就此废掉,博主决定长期研究下多线程的java基础知识,算是巩固。本系列博文博主会不定期更新且长期更新下去,水平不够,如有发现不当之处欢迎批评指正,共同学习。通过本文你可以了解到: 1、顺序执行线程的方式 2、多个任务终止的方法 3、线程池的工作原理或者线程复用的原理。今天就来简单介绍Executor这个东西,这玩意是什么呢?官方注释...原创 2018-08-03 18:50:10 · 602 阅读 · 0 评论 -
ThreadLocal原理浅析
ThreadLocal即线程局部变量的意思!所以什么是线程局部变量?这玩意有什么鸟用?是不是面试被问到了说不出个一二三?今天就来扒一扒这货的源码,从根本上了解这货是干啥的。其实研究下来他的源码实现,其实也没想象的那么复杂,其最主要有以下几点:1、每一个Thread对象都有一个ThradLocalMap实例dfadfadf参考资料:ThreadLocal源码分析...原创 2019-09-27 20:51:19 · 1648 阅读 · 4 评论 -
垃圾收集与对象生命拯救(读书笔记)
Java是根据根搜索算法来判断对象是否存活的。基本思路是:通过一系列名为“GC Roots”的对象作为起点,向下搜索锁走过的路径(称为引用链),当一个对象与GC Roots之间的连接是断开的,也就是对象与GC Roots之间是不可达的时候,该对象就是“不可用”的,注意只是不可用的而不是该对象已经死了。这时候该对象只是暂时处于死刑的“缓刑”阶段。既然是缓刑,就可以补救回来。 其实要原创 2012-11-14 17:17:01 · 1744 阅读 · 0 评论 -
java同步和互斥程序说明(一)
所有对象都自动含有单一的锁,也就是所有对象都有且只有唯一的锁,所以当某个任务(线程)访问一个类A中含有sycnhronized的方法是,那么在这个线程从该方法返回之前(也就是该方法在当前线程执行完之前),类A中的其他被该关键字标记的方法在其他的线程中都会被阻塞。 通俗点说就是,当调用A的含有synchronized的方法是,A会被枷锁,此时A中其他含有synchroniz原创 2012-06-01 00:21:38 · 2670 阅读 · 0 评论 -
java线程知识点拾遗(1)
作为一个android开发者的我来说,面试最怕问的问题就是问多线程方面的,问之必死~~。因为android monkey在开发中多线程开发的场景使用起来几乎没有,所以就滋生了自己的懒惰性,人家说哪里跌倒哪里爬起来,这工作几年了也没爬起来,有点小羞愧。于是准备抽点时间好好研究下这个东东。不要逼我,逼急了我什么都能做出来! 来来来,现场手写一个自旋锁出来试试!卒!在多线程的编程中,如果需要加锁的情...原创 2019-08-12 15:44:33 · 381 阅读 · 0 评论 -
缓冲区ByteBuffer简单说明
ByteBuffer position limit flip原创 2014-05-28 17:18:17 · 16417 阅读 · 2 评论 -
Java并发编程实践笔记(一)
Collections.synchronizedList原创 2014-04-17 16:51:05 · 2527 阅读 · 1 评论 -
每天一点正则表达式积累(四)
// 以h开头的 p("hello sir".matches("^h.*"));//true 说明^ 行的开头 .*代表任意字符出现零次或者多次 p("hello sir".matches("^a.*"));//false p("h".matches("^h.*"));//true p("hello sir".matc原创 2012-06-08 23:28:17 · 1805 阅读 · 0 评论 -
每天一点正则表达式积累(三)
p(" \n\r\t".matches("\\s{4}"));//true 说名\s 空白字符:[ \t\n\x0B\f\r] p(" ".matches("\\S"));//false 说明\S 非空白字符:[^\s] 所以是false p("a_8".matches("\\w{3}"));//true p("abc888&^%".matches(原创 2012-06-07 22:30:44 · 1915 阅读 · 0 评论 -
每天一点正则表达式复习(二)
\\d代表数字 api解释 :X{n,m} X,至少 n 次,但是不超过 m 次 p("214523145234532".matches("\\d{3,100}"));//true p("214523145234532".matches("\\d{3,10}"));//false p("1234567890".matches("\\d{10}"))原创 2012-06-06 22:16:30 · 1453 阅读 · 0 评论 -
生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
在《java 同步和互斥程序说明》这篇文章的基础上,来实现下面的程序桌上有一个空盘子,只允许放一个水果。爸爸可以向盘中放苹果,也可以向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时,一次只能放一只水果。下面是程序的具体实现代码,在写这个程序的时候,有点小问题,纠结了很长时间,于是在csdn论坛上发表帖子终于得到了解决先说说涉及到的类的作用,首先Frui原创 2012-06-01 01:04:47 · 12853 阅读 · 17 评论 -
每天一点正则表达式复习(一)
// 一个点代表一个字符,api解释为任何字符 p("abc".matches("..."));//true p("123".matches("..."));//true //把所有的数字替换成-,\d代表 数字 两个\\代表一个反斜线 p("a8729a".replaceAll("\\d", "-"));//a----原创 2012-06-05 23:59:13 · 2214 阅读 · 0 评论 -
java同步和互斥
来源:http://blog.youkuaiyun.com/lazy_tiger/article/details/1820582 Java关键字synchronized是Java 语言提供的对多线程和同步的一种机制。synchronized可以作为函数的修饰符,也可作为函数内的语句。它可以作用于instance变量,对象引用(object reference),static函数和类名称字面常量(转载 2012-05-31 22:38:33 · 7637 阅读 · 0 评论 -
java类加载器ClassLoader浅析
看了看Spring源码,里面用到了ClassLoader。比如ClassPathResource里就用到了,所以现在系统地说明一下,下面给出个例子程序public class ClassLoaderDemo { public static void main(String[] args) { Class c; ClassLoader cl;原创 2012-05-10 21:31:43 · 1166 阅读 · 0 评论 -
再谈this的作用
最重要的一点就是对当前对象的理解:当前对象就是指当前正在调用类中方法的对象public class ThisTest { public static void main(String[] args) { T t1 = new T(); T t2 = new T(); t1.print(); System.out.print原创 2010-10-23 23:06:00 · 1016 阅读 · 0 评论 -
数据库与java操作小有体会
注意体会面向对象设计思想的理解及应用 怎样将数据库中的值与java语言产生联系,或者说怎样进行数据库设计才能使得数据库中的各个表与面向对象语言很好的关联呢?下面说一下本人的理解和简短说明,不到之处欢迎拍砖 首先说明,这里的数据库为关系数据库,存储数据的原创 2011-09-17 11:42:43 · 1339 阅读 · 0 评论 -
浅析java枚举类
下面先看两个典型的枚举类的例子: public enum Size{SMALL,MEDIUM,LAEGE,EXTRA_LAEGE}; public enum Direction{LEFT,RIGHT,UP,DOWN};实际上这就是声明就是一个类,它们刚好有四个实例。(注意在比较枚举类型的值时。永远不要调用equals。直接用==即可)。当然如果需要的话,可以在枚举类里添加一些构造器,方法,和属性,例如下面的棋子类:/**枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方原创 2011-04-28 22:29:00 · 1244 阅读 · 0 评论 -
每天一点正则表达式积累(五)
/** * matches用于匹配整个字符,find找子串,其中find方法调用之后, * 可调用Matcher的toString方法,返回的字符串中 * 的lastmatch来检查哪些子串获得匹配字 * ,不过最简单的方法是调用group(),注意reset的影响,lookingAt每次从头找 * 注意st原创 2012-06-09 23:17:55 · 2110 阅读 · 0 评论