方法一
加Lock同步锁实现,对多线程共享的数据加锁实现线程同步。
代码示例:
//票数
private int count = 100;
//声明lock锁(是非公平锁)
ReentrantLock lock = new ReentrantLock();
public void a() {
//获取锁
lock.lock();
try {
if (count > 0) {
//休息
Thread.sleep(10);
//票存在,卖票 ticket--
System.out.println(Thread.currentThread().getName() + "-->正在卖第" + count + "张票");
count--;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//手动释放锁
lock.unlock();
}
}
测试:
@org.junit.Test
public void b() {
long start = System.currentTimeMillis();
for (int i = 0; i < 500; i++) {
new Thread(new Runnable() {
@Override
public void run() {
a();
}
}).start();
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
测试结果:
方法二
加synchronized同步代码块关键字,实现线程的同步。
代码示例:
public synchronized void c() {
if (count > 0) {
try {
Thread.sleep(10);
//票存在,卖票 ticket--
System.out.println(Thread.currentThread().getName() + "-->正在卖第" + count + "张票");
count--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试:
@org.junit.Test
public void d(){
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
c();
}
}).start();
}
}
测试结果:
总结
synchronized和Lock都可以解决多线程共享的数据的问题。两者都是共享锁。但是synchronized是不需要声明一个锁的,只需要将要同步的代码写在synchronized修饰即可,但是lock锁需要声明一个,并且需要在finally中手动释放同步锁。