线程
- 通俗的讲,线程是一个程序里面不同的执行路径。
- 线程的基本概念
- 进程是一个静态的概念,在机器里运行的都是线程
- 线程是一个进程里的不同执行路径,main方法作为主线程
- 一个cpu只能执行一个线程
- 线程启动,必须调用Thread类的start()方法
- 只要能使用接口,就不要从Thread里继承
- 继承比较死,只能继承一个类;但是实现接口以后可以从其他类继承而且也还可以实现接口。
- 接口比较灵活。
-
sleep:当前线程休眠
-
run方法已结束,线程就结束
-
join合并某个线程
-
yield方法
线程同步
- 死锁
public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
public void run() {
System.out.println("flag=" + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("i");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("i");
}
}
}
}
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}
对于这种情况,简单的避免死锁的出现,可以采取把锁的粒度加粗,如锁定整个对象而不是两个小对象
加锁,写一个同步的东西比较困难。一个方法做了同步,一个方法没做,那么记住别的方法可以访问非同步的方法。并且可能会对同步的方法产生影响。
加了同步,速率变低,不加同步有可能产生数据不一致的现象
一般对于读不用加,改的方法要加锁。