1. 同步代码块
synchronized(对象)
{
需要同步的代码;
}
例程
package cn.wf.thread1;
/**
* 多线程同步:同步代码块
* @author wf
*
*/
public class Thread_Test {
public static void main(String[] args) {
Thread01 t = new Thread01();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class Thread01 implements Runnable {
private int tickets = 5;
@Override
public void run() {
while (true) {
synchronized (this) {
if (tickets <= 0) {
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"出票"+tickets);
tickets -= 1;
}
}
}
}
运行结果
Thread-0出票5
Thread-0出票4
Thread-0出票3
Thread-0出票2
Thread-0出票1
2. 同步方法
访问控制符 synchronized 返回值类型 方法名(参数)
{
....;
}
例程
package cn.wf.thread1;
/**
* 多线程同步:同步方法
* @author wf
*
*/
public class Thread_Test02 {
public static void main(String[] args) {
Thread02 t = new Thread02();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class Thread02 implements Runnable {
private int tickets = 15;
@Override
public void run() {
while (tickets>0) {
sale();
}
}
private synchronized void sale() {
if (tickets > 0)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"出票"+tickets);
tickets -= 1;
}
}
}
运行结果
Thread-0出票5
Thread-0出票4
Thread-0出票3
Thread-0出票2
Thread-0出票1