实现线程安全的三种方式
实现线程安全的三种方式
一、Synchronized
1. 同步方法
public class MyThread extends Thread{
private int ticket = 10000;
//重写run()方法
public void run(){
while (ticket > 0){
this.getTicket();
}
}
//非静态的同步方法同步监视器为this(类的对象)
//静态的同步方法同步监视器为类本身(MyThread.Class)
public synchronized void getTicket(){
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "--got ticket with no." + ticket);
ticket--;
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread thread1 = new Thread(myThread);
Thread thread2 = new Thread(myThread);
Thread thread3 = new Thread(myThread);
thread1.setName("用户1");
thread2.setName("用户2");
thread3.setName("用户3");
//调用start()方法开启多线程执行
thread1.start();
thread2.start();
thread3.start();
}
1. 同步代码块
public class MyThread2 extends Thread {
private int ticket = 10000;
//重写run()方法
public void run(){
while (ticket > 0) {
synchronized (this) {
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + "--got ticket with no." + ticket);
ticket--;
} else {
break;
}
}
}
}
public static void main(String[] args) {
MyThread2 myThread2 = new MyThread2();
Thread thread1 = new Thread(myThread2);
Thread thread2 = new Thread(myThread2);
Thread thread3 = new Thread(myThread2);
thread1.setName("用户1");
thread2.setName("用户2");
thread3.setName("用户3");
//调用start()方法开启多线程执行
thread1.start();
thread2.start();
thread3.start();
}
}
二、手动Lock
public class MyThread3 implements Runnable {
private int ticket = 100;
//启用公平锁
private ReentrantLock lock = new ReentrantLock(true);
@Override
public void run() {
while (ticket > 0) {
try {
//手动上锁
lock.lock();
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "--got ticket with no." + ticket);
ticket--;
} else {
break;
}
} finally {
//手动释放锁
lock.unlock();
}
}
}
public static void main(String[] args) {
MyThread3 myThread3 = new MyThread3();
Thread thread1 = new Thread(myThread3);
Thread thread2 = new Thread(myThread3);
Thread thread3 = new Thread(myThread3);
thread1.start();
thread2.start();
thread3.start();
}
}
上一篇:
通过多线程提高代码的执行效率例子
