-
迫于生计,又要从零开始学习spring. 在这篇文章之前,对java的基础是2015年写过一个java大作业,对spring是一无所知。 为了学习spring,我按顺序做了以下事情: * 学习了一下java语法,教程关键词是"java tutorial for cpp programmers",比如[Learning a New Programming Language: Java for C++ Programmers ](http://pages.cs.wisc.edu/~hasti/cs368/JavaTutorial/) * 对spring有个大体的了解。视频教程要比官方文档或者博客迅速得多。推 …
Read More -
真是个不明觉厉的术语...其实是个特别简单的概念orz 用白话讲,如果一个class A中用到了class B的实例,那么class B的实例就是class A的依赖,如果不是在class A中定义class B的实例,而是通过某个接口,将class B的实例传入classA,就叫依赖注入。 public class Example { // private DatabaseThingie myDatabase; // public Example() { // myDatabase = new DatabaseThingie(); // } public Example(DatabaseThingie …
Read More -
把std::async,std::packaged_task,std::promise三个放在一起来说,是因为他们都可以返回一个std::future对象.简单来说,当某个线程需要等待一个特定的一次性事件(one-off event),它可以用一个"future"来表示这个事件. std::async 有的时候可能你需要做一个花费事件比较长的计算,但是计算结果不是立刻需要.这个时候就可以用一个新的线程来做这个计算.这里比较关键的问题是如何将在新线程进行计算的结果传回到当前线程,因为std::thread并没有提供一个类似的机制. 这个时候就需要std::async登场了. 1 2 #include …
Read More -
condition_variable 类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable 。 用人话来说,condition_variable,也就是条件变量,是线程间通信的一种方式。 线程之间在很多时候需要通信,比如经典的生产者消费者问题 一个比较naive的方案是,用mutex来保护一个flag,然后另一线程不停得check这个flag的状态是否改变。以及在这个方案上的改进:让另一个线程check之后,可以先睡一段时间。 但是这两种方法都不够好。第一种不好的原因当然是不停得check,肯定会耗费大量的资源。而第二种,由于没办法准确估计要休眠的时间,因 …
Read More -
多线程保护数据时,一种较为特殊的情况是只需要保护资源的初始化。 资源初始化一般遵循"lazy initialization"的原则,也就是在用到该资源最近的地方再初始化。 比较容易想到的办法是用std::mutex,将资源初始化的地方锁起来,如下: 1 std::shared_ptr<some_resource> resource_ptr; 2 std::mutex resource_mutex; 3 void foo() 4 { 5 std::unique_lock<std::mutex> lk(resource_mutex); 6 if(!resource_ptr) 7 { 8 …
Read More -
起因是想更新一个array类型的state,结果setState更新之后用console.log() debug 结果,发现结果特别玄学。。。 查了下发现this.setState是个异步操作。。。 参考资料: 深入理解React 组件状态(State) React中setState同步更新策略 https://react.docschina.org/docs/react-component.html
Read More -
先放资料: Learning a New Programming Language: Java for C++ Programmers java package 先说几条重要的人话: * 一个java文件第一行可以声明该文件所属于的package,package的名字必须与整个工作目录的路径名相同。 * 同一个package下的class默认有互相访问的权限。 * 访问属性设置为public的class,如果该class所在的file声明了package,那么可以被其他package下的class访问到。 * .java的文件名必须与文件中设置为public的class名保持一致(如果没有public的类,那么名称任意) …
Read More -
背景 move semantics是modern cpp中非常重要的特性,有必要详细了解一下。 updateime: 2022年7月2日 move semantic 基本的内容大家都很熟悉,就不说了 std::move 做了什么 std::move没有move任何内容,只是简单把传进来转换为对应的rvalue reference 实现为: 1 2template<typename T> 3constexpr std::remove_reference_t<T>&& move(T&& t) noexcept 4{ 5 return …
Read More -
起因是在看《CplusplusConcurrencyInAction_PracticalMultithreading》的时候,里面讲到初始化std::thread的时候,如果thread funtion的参数列表中有引用,需要传入std::ref才可以得到符合预期的结果。 查阅发现std::ref是用来生成std::reference_wrapper。 按照 cppreference 上的话来说 `std::reference_wrapper` 是包装引用于可复制、可赋值对象的类模板。它常用作将容器存储入无法正常保有引用的标准容器( …
Read More -
20181014update: 可以不写了,开心 迫于生计,要从零开始学习前端。 由于之前的to do list 年代久远+ 前端的技术栈可之前几乎没有关系,因此新开一篇记录。 * css盒子模型 * 布局,flex * 前端debug的方法 * <del>javascript,</del>有空可以使用js刷leetcode练习语法 * <del>typescript</del> * jsx,以及jsx的typescript版tsx * 学习axios https://alligator.io/react/axios-react/ * 学习dva: …
Read More