线程同步,为什么要引入线程同步?
多个线程同时访问共享资源时候,如果没有先来后到,可能造成结果的不可再现性,使得结果背离预期的结果,例如多人抢少量票,银行取钱等.
线程同步的实现是依靠队列和锁来实现的
java中的锁有两种
- Syschronized同步锁,既可以修饰同步代码块,也可以去修饰方法,默认的钥匙是this的类对象.
package ThreadDemo2;
public class TicketThread extends Thread{
static int num=10000;
@Override
public void run() {
while(true) {
if (num>0){
ticket();
}else {
break;
}
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static synchronized void ticket(){ //线程同步锁
System.out.println(Thread.currentThread().getName()+"出票"+num);
num--;
}
}
- Lock锁, 只能给同步代码块加锁, 不能给方法加锁.手动开启和关闭,在需要同步代码结束的时候进行关闭.
package ThreadDemo3;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo1 implements Runnable {
static int num=10;
Lock lock = new ReentrantLock();
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock(); //给线程加锁
if (num<=0){
System.out.println("票已经卖光了!!!");
break;
}else {
System.out.println(Thread.currentThread().getName()+":出票编号"+num);
num--;
}
lock.unlock(); //手动关锁
}
}
}
package ThreadDemo3;
import java.util.concurrent.locks.Lock;
public class LockTest1 {
public static void main(String[] args) {
LockDemo1 lockDemo1 = new LockDemo1();
Thread thread1 = new Thread(lockDemo1,"窗口1");
Thread thread2 = new Thread(lockDemo1,"窗口2");
Thread thread3 = new Thread(lockDemo1,"窗口3");
thread1.start();
thread2.start();
thread3.start();
}
}
关于线程造成的一些问题会在其他文章中展示