Fork me on GitHub

Leetcode-055-跳跃游戏

Leecode-055-Jump Game

思路:贪心算法

题目描述

给定一个非负的整数数组,从0索引位置出发,看是否可以跳到数组最后一个元素。

1
2
3
4
Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
// 可以从索引2的位置跳3步到最后一个位置
1
2
3
4
Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
  jump length is 0, which makes it impossible to reach the last index.
阅读更多...

JUC-03-八锁现象

JUC-03-八锁现象

1. Synchronized 锁的对象问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.zhuuu.lock8;


// 8锁: 锁的八个问题
// 1. 标准情况下 : 发短信 打电话
// 2. 延迟四秒后: 发短信 打电话


import java.util.concurrent.TimeUnit;

public class Test1 {
public static void main(String[] args) {
Phone phone = new Phone();

// 锁的存在
new Thread(()->{
phone.sendSms();
},"A").start();

// 休息一秒
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}

new Thread(()->{
phone.call();
},"B").start();
}
}



class Phone{

// synchronized 锁的对象是方法的调用者
// 这里两个方法拿到的是同一个锁:谁先拿到 谁先执行

public synchronized void sendSms(){
// 休息一秒
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}

public synchronized void call(){
System.out.println("打电话");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.zhuuu.lock8;

import java.util.concurrent.TimeUnit;

// 3. 增加了一个普通方法 先执行 hello 再执行 发短信
// 4. 两个对象,两个同步方法, 先 打电话 再 发短信 (按时间执行)

public class Test2 {
public static void main(String[] args) {
// 如果有两个对象
// 两个对象 两个调用者 两把锁!!!
Phone2 phone2 = new Phone2();
Phone2 phone1 = new Phone2();

// 锁的存在
new Thread(()->{
phone2.sendSms();
},"A").start();

// 休息一秒
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}


new Thread(()->{
phone1.call();
},"B").start();
}
}



class Phone2{

// synchronized 锁的对象是方法的调用者
// 这里两个方法拿到的是同一个锁:谁先拿到 谁先执行

public synchronized void sendSms(){
// 休息一秒
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}

public synchronized void call(){
System.out.println("打电话");
}

// 这里没有锁 不是同步方法

public void hello(){
System.out.println("hello");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.zhuuu.lock8;

import java.util.concurrent.TimeUnit;

//5. 增加两个静态的同步方法 (锁的是class)(发短信 打电话)
//6. 两个对象 还是两个静态同步方法 (发短信 打电话)

public class Test3 {
public static void main(String[] args) {
// 这里两个对象的Class类模板只有一个
// 锁的是同一个class
Phone3 phone3 = new Phone3();
Phone3 phone4 = new Phone3();

// 锁的存在
new Thread(()->{
phone3.sendSms();
},"A").start();

// 休息一秒
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}


new Thread(()->{
phone4.call();
},"B").start();
}
}



// Phone3 只有唯一的一个class对象

class Phone3{

// static 静态方法 (类一加载就有)
// static 这里锁的是class

public static synchronized void sendSms(){
// 休息一秒
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}

public static synchronized void call(){
System.out.println("打电话");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.zhuuu.lock8;

import java.util.concurrent.TimeUnit;

// 7. 一个静态同步方法 一个普通同步方法 一个对象( 打电话 发短信)
// 8. 一个静态同步方法 一个普通同步方法 两个对象( 打电话 发短信)

public class Test4 {
public static void main(String[] args) {
// 这里两个对象的Class类模板只有一个
// 锁的是同一个class
Phone4 phone1 = new Phone4();
Phone4 phone2 = new Phone4();

// 锁的存在
new Thread(()->{
phone1.sendSms();
},"A").start();

// 休息一秒
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}


new Thread(()->{
phone2.call();
},"B").start();
}
}


class Phone4{

// static 静态方法 (类一加载就有)
// static 这里锁的是class

// 静态的同步方法 锁的是class类模板
public static synchronized void sendSms(){
// 休息一秒
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("发短信");
}

// 普通的同步方法 锁的是调用者
public synchronized void call(){
System.out.println("打电话");
}
}

2. 小结

  • new : 具体的一个实例
  • static : class模板

(本质上:两个拿到的锁不一样)

通信原理-11-差错控制编码

差错控制编码

目的:提高通信的可靠性

(原因:数字通信可能因为各种干扰(乘性,加性),使传送的数据流产生误码。)

本质:是纠错编码,是一种信道编码

举个例子:

1
2
发送   0	0	1	1	1	0	0	0	1	0	0
接受 0 0 0 0 1 0 1 0 1 0 0
  • 针对乘性干扰:采用均衡的措施(频域均衡,时域均衡)
  • 针对加性干扰:合理选择调制方法/解调方法 ,增大发射功率。
阅读更多...

Redis-11-主从复制

Redis-11-主从复制

1. 概念介绍

  • 前面介绍Redis,我们都在一台服务器上进行操作的,也就是说读和写以及备份操作都是在一台Redis服务器上进行的,那么随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都很快,但是一定程度上也会造成一定的延时,那么为了解决访问量大的问题,通常会采取的一种方式是主从架构Master/Slave,Master 以写为主,Slave 以读为主,Master 主节点更新后根据配置,自动同步到从机Slave 节点。

mark

最低需要一主二从(三台服务器)

阅读更多...
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信