同步就是一个线程对象等待另一个线程对象执行完毕。
同步与异步相比较,异步操作的执行速度高,同步操作时数据的安全性较高,属于安全的线程。大部分情况下使用异步。
多个线程访问同一资源时,一定要处理好同步,可以采用同步代码块或者同步方法来实现。
过多地使用同步可能会造成死锁,死锁是程序开发中由于逻辑错误而产生的问题。并不是简单地就出现的。
class MyThread implements Runnable {
private int ticket = 100;
@Override
public void run() {
for (int i = 0; i < 200; i++) {
if (this.ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + this.ticket);
this.ticket--;
}
}
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
Thread A = new Thread(myThread1,"Thread A");
Thread B = new Thread(myThread1,"Thread B");
Thread C = new Thread(myThread1,"Thread C");
Thread D = new Thread(myThread1,"Thread D");
A.start();
B.start();
C.start();
D.start();
}
}
同步代码块
class MyThread implements Runnable {
private int ticket = 1000;
@Override
public void run() {
for (int i = 0; i < 2000; i++) {
synchronized (this) { //当前操作每次只允许一个对象进入
if (this.ticket > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + this.ticket);
this.ticket--;
}
}
}
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
Thread A = new Thread(myThread1,"Thread A");
Thread B = new Thread(myThread1,"Thread B");
Thread C = new Thread(myThread1,"Thread C");
Thread D = new Thread(myThread1,"Thread D");
A.start();
B.start();
C.start();
D.start();
}
}
同步方法
class MyThread implements Runnable {
private int ticket = 100;
@Override
public void run() {
for (int i = 0; i < 200; i++) {
this.sale();
}
}
public synchronized void sale(){
if (this.ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + this.ticket);
this.ticket --;
}
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
Thread A = new Thread(myThread1,"Thread A");
Thread B = new Thread(myThread1,"Thread B");
Thread C = new Thread(myThread1,"Thread C");
Thread D = new Thread(myThread1,"Thread D");
A.start();
B.start();
C.start();
D.start();
}
}