快手(质量效能组)## 快手一面(5.27)1. 讲一下两个项目 阿巴阿巴...... 2. 讲一下你理解的redis和mysql 3. 为什么redis可以基于内存,如何保证数据不丢失? rdb或AOF? 4. Tcp和udp的区别是什么 5. 负载均衡原理 想不起来,没好意思说,就提了几下负载均衡的算法 6. java中避免死锁的方法 就说上来了个锁在Java中避免死锁是一个重要的编程任务,特别是在多线程编程中。以下是一些常用的方法来避免死锁: 1. **避免嵌套锁**: 尽量减少一个线程持有多个锁的情况。这样可以降低发生死锁的风险。 2. **锁的顺序**: 确保所有线程以相同的顺序获得锁。例如,如果线程A和线程B都需要锁L1和锁L2,那么确保它们总是先获取锁L1,再获取锁L2。这可以通过定义全局锁顺序来实现。 3. **使用超时尝试获取锁**: 使用`tryLock`方法代替`lock`方法,这样可以设定一个超时时间。如果无法在超时时间内获取锁,线程可以放弃获取锁,从而避免死锁。示例如下: 4. **避免长时间持有锁**: 锁的持有时间越长,发生死锁的可能性越大。因此,应尽量减少锁持有的时间,仅在需要的时候持有锁,并在完成后立即释放。 5. **使用更高层次的锁管理机制**: 使用Java并发包中的高级并发工具,例如`java.util.concurrent`包中的`Lock`, `ReentrantLock`, `ReadWriteLock`等,它们提供了更灵活的锁管理机制。 6. **检测和预防死锁**: 实现死锁检测机制,监视线程获取锁的状态,如果检测到死锁,采取适当的措施(例如中断相关线程)。一些工具和库可以帮助检测死锁,例如JConsole和VisualVM。 7. ```java //括号匹配 //大喊我是傻逼 import java.util.*; public class Main { public static void main(String[] args) { //String str = "niin"; // 不是真有傻逼这样写 String str = "((())))"; Deque stk = new LinkedList<>(); for(char c : str.toCharArray()){ if(c == '('){ stk.push(')'); }else if(c == '{'){ stk.push('}'); }else if(c == '['){ stk.push(']'); }else if(stk.isEmpty() || stk.peek() != c){ break; }else{ stk.pop(); } } boolean flag = stk.isEmpty(); System.out.println(flag); } } ``` 8. 大文件传输用udp还是tcp 9. ```sql --A一个表name,id,socre --B一个表id,major select A.name,B.major from A join B on A.id = B.id where A.score > 60 ``` 10. 反问: 部门,效能开发,偏向于开发是吧 > 快手的一面果然还是一如既往的高效且温柔,速度极快,就是我的水平太差了,但是!,她以为我是研究生,最后还挺不好意思的,最后没问什么就直接给我过了(38min) #软件开发笔面经#