1 简介

  synchronized在方法内,同步代码块,传入对象,使用的是对象锁,传入class对象,使用的是类锁

  作用于普通方法,也是对象锁,当前对象

  作用于静态方法,是类锁

2 同步方法示例

2.1两个synchronized 修饰的普通方法

public class SychTest1 {
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){ //相当于synchromized(this)
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start();

      //等待200

try { Thread.sleep(200); } catch (InterruptedException e)

    </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendMsg();
}).start();
}

}

执行结果

EMAIL
MSG

2.2两个synchronized 修饰的普通方法,sendEmail睡了2秒

public class SychTest2 {
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">2000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start(); </span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">200</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
</span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendMsg();
}).start();
}

}

执行结果,发现第一个线程调用的sendEmail方法虽然等待了2秒,还是先打印,因为它先获取了锁,第二个线程只能等待。它们竞争的是同一个锁对象p

EMAIL
MSG

2.3一个同步方法,一个普通方法

public class SychTest3 {
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">2000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
} } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start(); </span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">200</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); } </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendMsg();
}).start();
}

}

执行结果

MSG
EMAIL

2.4两个同步方法,但是是两个不同的对象p和p2去调用同步方法

public class SychTest4 {
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">2000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
} } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); Phone p2 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start(); </span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">200</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); } </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p2.sendMsg();
}).start();
}

}

执行结果,持有的是不同的锁对象p和p2

MSG
EMAIL

2.5两个静态同步方法

public class SychTest5 {
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){ //相当于synchronized(Phone.class)
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">2000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
synchronized </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start(); </span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">200</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); } </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendMsg();
}).start();
}

}

执行结果,持有的是同一个类锁

EMAIL
MSG

2.6 两个静态同步方法,两个对象p和p2去调用

public class SychTest6 {//?
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">2000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
synchronized </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone();
Phone p2 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start(); </span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">200</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); } </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p2.sendMsg();
}).start();
}

}

执行结果,持有的是同一个类锁,和哪个对象去调用无关

EMAIL
MSG

2.7一个静态同步,一个非静态同步

public class SychTest7 {
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">2000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start(); </span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">200</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); } </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendMsg();
}).start();
}

}

执行结果,一个持有类锁,一个持有对象锁

MSG
EMAIL

2.8一个静态同步方法,一个非静态同步方法,两个对象去调用

public class SychTest8 {
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Phone{
synchronized </span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> sendEmail(){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">2000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">EMAIL</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
synchronized </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sendMsg(){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">MSG</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) { Phone p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); Phone p2 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Phone(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p.sendEmail();
}).start(); </span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">200</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); } </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
p2.sendMsg();
}).start();
}

}

执行结果,一个持有类锁,一个持有对象锁

MSG
EMAIL

3 同步代码示例

3.1传入class对象

public class SychTest13 {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> synchronized  <span style="color: #0000ff;">void</span><span style="color: #000000;"> aa()  {
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">aaa</span><span style="color: #800000;">"</span><span style="color: #000000;">);
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) throws InterruptedException { </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
synchronized (SychTest13.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">1000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">aaaaaaaaaaaa</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}).start(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
synchronized (SychTest13.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">bbbbbbbbbb</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}).start();
}

}

执行结果

aaaaaaaaaaaa
bbbbbbbbbbb

3.2传入同一个对象t1

public class SychTest14 {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> synchronized  <span style="color: #0000ff;">void</span><span style="color: #000000;"> aa()  {
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">aaa</span><span style="color: #800000;">"</span><span style="color: #000000;">);
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) throws InterruptedException {
SychTest13 t1 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> SychTest13();
</span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
synchronized (t1){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">1000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">aaaaaaaaaaaa</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}).start(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
synchronized (t1){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">bbbbbbbbbb</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}).start();
}

}

执行结果

aaaaaaaaaaaa
bbbbbbbbbbb

3.3传入对象t1和t2

public class SychTest15 {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> synchronized  <span style="color: #0000ff;">void</span><span style="color: #000000;"> aa()  {
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">aaa</span><span style="color: #800000;">"</span><span style="color: #000000;">);
} </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) throws InterruptedException {
SychTest13 t1 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> SychTest13();
SychTest13 t2 </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> SychTest13();
</span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
synchronized (t1){
</span><span style="color: #0000ff;">try</span> { Thread.sleep(<span style="color: #800080;">1000</span>); } <span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) { e.printStackTrace(); }
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">aaaaaaaaaaaa</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}).start(); </span><span style="color: #0000ff;">new</span> Thread(()-&gt;<span style="color: #000000;">{
synchronized (t2){
System.</span><span style="color: #0000ff;">out</span>.println(<span style="color: #800000;">"</span><span style="color: #800000;">bbbbbbbbbb</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}).start();
}

}

执行结果

bbbbbbbbbb
aaaaaaaaaaaa

4 注意事项

4.1 异常

  锁会被释放,其它线程可能进来继续执行。
  会出现数据不一致的情况,多个servlet线程访问同一个资源时,如果第一个线程抛出异常,其他线程就会进入同步代码块,有可能会访问到异常产生时的数据(异常产生的数据很可能是不对的),出现数据不一致的情况

4.2 锁对象

  synchronized (obj),obj不要用String、常量、基本数据类型。
  因为使用字符串、常量,你可以使用,其它人也可以使用,你们很可能都不知道对方使用了,那么就有问题了

线程基础知识05 synchronized类锁和对象锁演示的更多相关文章

  1. Java并发编程(一):线程基础知识以及synchronized关键字

    1.线程与多线程的概念:在一个程序中,能够独立运行的程序片段叫作“线程”(Thread).多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术. 2.多线程的意义:多线 ...

  2. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  3. java synchronized类锁,对象锁详解(转载)

    觉得还不错 留个记录,转载自http://zhh9106.iteye.com/blog/2151791 在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看 ...

  4. Synchronized方法锁、对象锁、类锁区别

    synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...

  5. 类锁、对象锁、互斥锁与synchronized

    本文总结自: https://blog.csdn.net/luckey_zh/article/details/53815694 互斥锁: 若对象有互斥锁,则在任一时刻,只能有一个线程访问对象.类锁.对 ...

  6. 并发编程大师系列之:Synchronized的类锁和对象锁

    说到并发编程,感觉跟大多数人一样,谈之色变,说它简单把,其实很有内容,说难吧,用起来也挺容易,最近我硬着头皮,决心要把并发编程好好的搞一遍.以前,面试的时候,面试官问,并发编程会吗?嗯,接触过,就加一 ...

  7. 类锁和对象锁,synchronized修饰static方法与非static方法的区别

    当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例), 作用范围是整个静态方法,作用的对象是这个类的所有对象. 当synchronized修 ...

  8. Java类锁和对象锁实践和内部私有锁关联

    Java类锁和对象锁实践 感谢[jiehao]同学的投稿,投稿可将文章发送到tengfei@ifeve.com 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为 ...

  9. Java类锁和对象锁实践(good)

    一.前言 之前对类锁和对象锁是否是互斥的不是太确定,因此决定编写相关的程序进行实践一下.编写前对相关定义约定约定如下: 1. 类锁:在代码中的方法上加了static和synchronized的锁,或者 ...

  10. Java 类锁、对象锁、私有锁

    3.6 Java类锁.对象锁.私有锁.隐式锁 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. ...

随机推荐

  1. maple软件安装教程

    Maple2022适用于Win7/10/11(64位)系统,亲测可用! Maple2022 WIN10 64位安装步骤:1.先使用"百度网盘"下载MPE22_CN_x64安装包到电 ...

  2. 3 c++编程-提高篇-模版

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦!  系列文章列表: 1 c+ ...

  3. 读 RocketMQ 源码,学习并发编程三大神器

    笔者是 RocketMQ 的忠实粉丝,在阅读源码的过程中,学习到了很多编程技巧. 这篇文章,笔者结合 RocketMQ 源码,分享并发编程三大神器的相关知识点. 1 CountDownLatch 实现 ...

  4. 协程Part1-boost.Coroutine.md

    首先,在计算机科学中 routine 被定义为一系列的操作,多个 routine 的执行形成一个父子关系,并且子 routine 一定会在父 routine 结束前结束,也就是一个个的函数执行和嵌套执 ...

  5. 火山引擎 DataLeap 的 Data Catalog 系统公有云实践

      Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景.本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Ca ...

  6. JDK卸载

    JDK卸载 从环境变量里的JAVA_HOME里找到jdk的主程序,删掉 把JAVA_HOME删掉,在把path里跟java_home相关的也删掉 在cmd里运行java-version

  7. 看起来简单实际上却很牛的KMP算法:LeetCode572-另一棵树的子树

    题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树.s 的一个子树包括 s 的一个节点和这个节点的所有子孙.s 也可以看做它自身的一棵子树. 暴力解法 从 ...

  8. LeetCode HOT 100:在排序数组中查找元素的第一个和最后一个位置

    题目:34. 在排序数组中查找元素的第一个和最后一个位置 题目描述: 给你一个递增数组,和一个目标值target,最终返回数组中第一次出现target和最后一次出现target的下标.如果该数组中没有 ...

  9. SQLMap入门——获取数据库的所有用户

    列出数据库中的所有用户 在当前用户有权读取包含所有用户的表的权限时,使用该命令列出所有管理用户 python sqlmap.py -u http://localhost/sqli-labs-maste ...

  10. 基于Hexo搭建静态博客

    关于静态博客 通常来讲,建立个人博客有2种方式: 第一,直接在第三方博客平台注册博客空间,如:博客园,简书,CSDN等,这种方式建立的博客,所有数据都存放在博客平台. 第二,自建博客系统,这种方式就是 ...