一、线程同步:
当两个或两个以上的线程同时访问一个资源。为了保护资源数据的安全,要求在同一时间只能一个线程访问该资源。
同步造成的结果:1、数据安全 2、效率低下。
二、线程死锁:
当两个线程循环依赖于一对同步对象时将发生死锁。例如:
一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何synchronized方法,就将发生死锁。
死锁很少发生,但一旦发生就很难调试。
三、线程状态:
四、
五、
示例:
- <span style="font-size:18px;">package java_520_1314;
- public class TestSynchronized {
- public static void main(String[] args) {
- MyObj obj = new MyObj();
- OneThread one = new OneThread(obj);
- TwoThread two = new TwoThread(obj);
- }
- }
- class MyObj {
- public boolean isRun = true;
- }
- class OneThread extends Thread {
- private MyObj obj;
- public OneThread(MyObj obj) {
- this.obj = obj;
- this.start();
- }
- public void run() {
- while (true) {
- // 同步块,当前线程对obj进行同步
- synchronized (obj) {
- if (obj.isRun == true) {
- System.out.print("AA");
- obj.isRun = false;
- // 唤醒下一个线程访问obj资源
- obj.notify();
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- } else {
- try {
- // 当前线程相对obj对象进行等待
- obj.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }
- class TwoThread extends Thread {
- private MyObj obj;
- public TwoThread(MyObj obj) {
- this.obj = obj;
- this.start();
- }
- public void run() {
- while (true) {
- synchronized (obj) {
- if (obj.isRun == false) {
- System.out.print("B");
- obj.isRun = true;
- // 唤醒下一个线程访问obj资源
- obj.notify();
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- } else {
- try {// 当前线程相对obj对象进行等待
- obj.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- }</span>
package java_520_1314;
public class TestSynchronized {
public static void main(String[] args) {
MyObj obj = new MyObj();
OneThread one = new OneThread(obj);
TwoThread two = new TwoThread(obj);
}
}
class MyObj {
public boolean isRun = true;
}
class OneThread extends Thread {
private MyObj obj;
public OneThread(MyObj obj) {
this.obj = obj;
this.start();
}
public void run() {
while (true) {
// 同步块,当前线程对obj进行同步
synchronized (obj) {
if (obj.isRun == true) {
System.out.print("AA");
obj.isRun = false;
// 唤醒下一个线程访问obj资源
obj.notify();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
// 当前线程相对obj对象进行等待
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
class TwoThread extends Thread {
private MyObj obj;
public TwoThread(MyObj obj) {
this.obj = obj;
this.start();
}
public void run() {
while (true) {
synchronized (obj) {
if (obj.isRun == false) {
System.out.print("B");
obj.isRun = true;
// 唤醒下一个线程访问obj资源
obj.notify();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {// 当前线程相对obj对象进行等待
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}