JUC并发编程三(线程间通信)
3 线程间通信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基于这两种模型来实现的。我们来基于一道常见的面试题目来分析
场景–两个线程,一个线程对当前数值加1,另一个线程对当前数值减1,要求用线程间通信
3.1 synchronized方案12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455public class TestVolatile { public static void main(String[] args) { DemoClass demoClass = new DemoClass(); new Thread(()->{ for (int i=0;i<5;i++){ demoClass.increment(); } }).s ...
JUC并发编程二(Lock接口)
2 Lock接口2.1 Synchronized2.1.1 Synchronized关键字Synchronized 是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;虽然可以使用 synchronized 来定义方法,但 synchronized 并不属于方法定义的一部分,因此,synchronized 关键字不能被继承。如果在父类中的某个方法使用了 synchronized 关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized 关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。
修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
修饰一个类,其作用 ...
策略模式
策略模式模式定义:
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式的变化独立于算法的使用者。
12345678910111213141516171819202122232425262728293031323334353637383940public class StrategyTest { public static void main(String[] args) { Context context = new Context(new GreenPen()); context.executeDraw(10,0,0); }}interface Strategy{ public int draw(int radius, int x, int y );}class RedPen implements Strategy{ @Override public int draw(int radius, int x, int y) { ...
装饰器模式
装饰器模式模式定义:
在不改变原有对象的基础上,将功能附加到对象上。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091public class DecoratorTest { public static void main(String[] args) { // 获取原茶 Beverage beverage = new Coffee(); // 加配料 beverage = new Lemon(beverage); // 加配料 beverage = new Pearl(beverage); System.out.println(beverage.getDescri ...
适配器模式
适配器模式模式定义:
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
123456789101112131415161718192021222324252627282930public class ObjectAdapter { public static void main(String[] args) { Adaptee adaptee = new Adaptee(); Adapter adapter = new Adapter(adaptee); adapter.output5v(); }}class Adaptee{ public int outPut220v(){ return 220; }}interface Target{ int output5v();}class Adapter implements Target ...
门面模式
门面模式
123456789101112131415161718192021222324252627282930public class FacadeTest { public static void main(String[] args) { ShapeMaker shapeMaker = new ShapeMaker(); shapeMaker.draw(); }}class ShapeMaker { private Circle circle; private Rectangle rectangle; public ShapeMaker(){ circle = new Circle(); rectangle = new Rectangle(); } public void draw(){ circle.draw(); rectangle.draw(); } ...
享元模式
享元模式模式定义:运用共享技术有效地支持大量细粒度的对象。
优点:如果系统有大量类似的对象,可以节省大量的内存及CPU资源。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647class TreeNode{ private int x; private int y; private Tree tree; public TreeNode(int x, int y, Tree tree) { this.x = x; this.y = y; this.tree = tree; } public int getX() { return x; } public int getY() { return y; } public Tree getTree() { ...
建造者设计模式
建造者模式模式定义:将一个复杂对象的创建与它的表示分离,使得同样的构建过程创建不同的表示
忽视Director、Product类,只关注建造本身
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071public class ComputerBuilder{ private String cpu; private String motherboard; private String monitor; private String keyboard; private String mouse; public ComputerBuilder(String cpu, String motherboard, String monitor, String keyboard, String mouse) { this. ...
抽象工厂模式
抽象工厂模式模式定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879public class AbstractFactoryTest { public static void main(String[] args) { IDatabaseUtils iDatabaseUtils = new OracleDataBaseUtils(); IConnection connection = iDatabaseUtils.getConnection(); connection.connect(); ICommand command = iDatabaseUtils.getCommand(); ...
hexo+markdown图片上传路径问题
hexo+typora+github图片路径问题一、typora资源文件夹设置
二、相对路径应用的标签插件首先引入hexo-renderer-marked –save
1npm install hexo-renderer-marked --save
然后修改_config.yml文件
1post_asset_folder: true
开启了之后,图片资源就会自动解析成对应的图片路径。比如:“test.jpg” 位于 “src=”/post/a24d988e/test.png””,
1![test](hexo-markdown图片上传路径问题/test.png)‘将会转换成’<img src="/post/a24d988e/test.png" alt="image-20230413011148293">
然后修改插件hexo-renderer-marked lib目录下面的renderer.js文件:(大概在119行)
添加如下代码:
123if(href.indexOf('/& ...