同步:并发 多个线程访问同一份资源 确保资源安全 --》线程安全
synchronized: 同步
1、同步块
synchronized(引用类型|this|类.class)
{
}
2、同步方法
public synchronized void test()
synchronized: 同步
1、同步块
synchronized(引用类型|this|类.class)
{
}
2、同步方法
public synchronized void test()
{}
public class TestSyn {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t, "甲");
Thread t2 = new Thread(t, "乙");
Thread t3 = new Thread(t, "丁");
t1.start();
t2.start();
t3.start();
}
}
class Ticket implements Runnable {
private int num = 10;
private boolean flag = true;
@Override
public void run() {
try {
while (flag) {
test4();
}
} catch (InterruptedException e) {
}
}
// 线程安全,同步块,慢
public void test3() throws InterruptedException {
synchronized (this) {
if (num <= 0) {
flag = false;
return;
}
Thread.sleep(1000);
System.out
.println(Thread.currentThread().getName() + "==>" + num--);
}
}
// 线程安全,锁定方法,慢
public synchronized void test2() throws InterruptedException {
if (num <= 0) {
flag = false;
return;
}
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "==>" + num--);
}
// 线程不安全,锁定范围不正确
public void test4() throws InterruptedException {
synchronized (this) {
if (num <= 0) {
flag = false;
return;
}
}
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "==>" + num--);
}
// 线程不安全,锁定范围不正确
public void test5() throws InterruptedException {
if (num <= 0) {
flag = false;
return;
}
synchronized (this) {
Thread.sleep(1000);
System.out
.println(Thread.currentThread().getName() + "==>" + num--);
}
}
// 线程不安全,锁定范围不正确
public void test6() throws InterruptedException {
synchronized ((Integer) num) {
if (num <= 0) {
flag = false;
return;
}
Thread.sleep(1000);
System.out
.println(Thread.currentThread().getName() + "==>" + num--);
}
}
// 线程不安全,没有锁定资源
public void test1() throws InterruptedException {
if (num <= 0) {
flag = false;
return;
}
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "==>" + num--);
}
}