一.同步
多线程在操作共享资源时,某一时刻只能有一个线程操作共享资源。
1.同步代码块
public class MyThread implements Runnable{
private int num = 400;
Object obj = new Object();
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
@Override
public void run() {
while(true){
synchronized(obj){
if(num>0){
System.out.println(Thread.currentThread().getName()+"...is saling..."+num);;
num--;
}
}
}
}
public static void main(String[] args) {
MyThread my = new MyThread();
Thread t0 = new Thread(my);
Thread t1 = new Thread(my);
t0.start();
t1.start();
}
}
2.同步方法
public class MyThread implements Runnable{
private int num = 400;
@Override
public void run() {
while(true){
fun();
}
}
public synchronized void fun(){
if(num>0){
System.out.println(Thread.currentThread().getName()+"...is saling..."+num);;
num--;
}
}
public static void main(String[] args) {
MyThread my = new MyThread();
Thread t0 = new Thread(my);
Thread t1 = new Thread(my);
t0.start();
t1.start();
}
}
3.两者的区别
- 同步代码块的锁是任意的,同步方法的锁是固定的, 静态同步方法的锁是该方法所属的对象(当前类运行时对象)。
- 同步的前提是必须有多个线程使用同一个锁。
- 判断锁的状态,会消耗系统资源从而导致程序的效率低。
二.死锁
1.什么是死锁
指多个线程竞争资源导致互相等待的僵局,如果没有外力的作用,这种现象将一直持续下去。
2.产生的条件
- 互斥:指共享资源在某一时刻只能被一个线程所占有,具有排他性。
- 不剥夺:指被线程所占有的资源不能被其它线程强行夺走,除非自己释放。
- 保持和请求:请求新资源的线程在占有一个资源的情况下,处于阻塞状态并且不释放已有的资源。
- 循坏等待链:有这样一种等待链,链上的线程所占有的资源是其它线程正在请求的资源。
3.实例
public class MyThread implements Runnable{
boolean flag = true;
Object chinese = new Object();
Object american = new Object();
@Override
public void run() {
if(flag){
while(true){
synchronized(american){
System.out.println("...if...american");
synchronized(chinese){
System.out.println("...if...chinese");
}
}
}
}
else{
while(true){
synchronized(chinese){
System.out.println("...else...chinese");
synchronized(american){
System.out.println("...else...american");
}
}
}
}
}
public static void main(String[] args) {
MyThread my = new MyThread();
Thread t0 = new Thread(my);
Thread t1 = new Thread(my);
t0.start();
try{
Thread.sleep(10);
}catch(InterruptedException e){
}
my.flag = false;
t1.start();
}
}