1.不同步可能导致公共资源分配不对的情况
class SaleTicketThread implements Runnable {
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("还剩" + ticket-- + "张票");
}
}
}
}
public class NoSynchronized {
public static void main(String[] args) {
SaleTicketThread saleTicketThread = new SaleTicketThread();
for (int i = 0; i < 3; i++) {
Thread thread = new Thread(saleTicketThread);
thread.start();
}
}
}
结果:
还剩10张票
还剩9张票
还剩8张票
还剩7张票
还剩6张票
还剩5张票
还剩4张票
还剩3张票
还剩2张票
还剩1张票
还剩0张票
还剩-1张票
加上synchronized同步来保证资源
class SaleTicketThread2 implements Runnable {
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 100; i++) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("还剩" + ticket-- + "张票");
}
}
}
}
}
public class HaveSynchronized {
public static void main(String[] args) {
SaleTicketThread2 saleTicketThread2 = new SaleTicketThread2();
for (int i = 0; i < 4; i++) {
Thread thread = new Thread(saleTicketThread2);
thread.start();
}
}
}
结果:
还剩10张票
还剩9张票
还剩8张票
还剩7张票
还剩6张票
还剩5张票
还剩4张票
还剩3张票
还剩2张票
还剩1张票
2.死锁
class ZhangSan {
public void say() {
System.out.println("李四,你给我画,我给你书");
}
public void get() {
System.out.println("张三得到画了");
}
}
class Lisi {
public void say() {
System.out.println("张三,你给我书,我给你画");
}
public void get() {
System.out.println("李四得到书了");
}
}
public class DeadLock implements Runnable {
private static ZhangSan zhangSan = new ZhangSan();
private static Lisi lisi = new Lisi();
private boolean flag = false;
public DeadLock(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
synchronized (zhangSan) {
zhangSan.say();
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lisi) {
lisi.get();
}
}
} else {
synchronized (lisi) {
lisi.say();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (zhangSan) {
zhangSan.get();
}
}
}
}
public static void main(String[] args) {
DeadLock deadLock1 = new DeadLock(true);
DeadLock deadLock2 = new DeadLock(false);
Thread thread1 = new Thread(deadLock1);
Thread thread2 = new Thread(deadLock2);
thread1.start();
thread2.start();
}
}
结果:
李四,你给我画,我给你书
张三,你给我书,我给你画
......
3.suspend,resume,stop都有可能导致死锁,用标志位来结束进程
class SellProduct implements Runnable {
private boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag) {
System.out.println(Thread.currentThread().getName() + "运行,i = " + (i++));
}
}
public void stopSell() {
flag = false;
}
}
public class StopThread {
public static void main(String[] args) {
SellProduct sellProduct = new SellProduct();
Thread thread = new Thread(sellProduct);
thread.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sellProduct.stopSell();
}
}