同步代码块
语法:
使用方法:
示例:
package com.ycy5;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SellTicket implements Runnable{
private int tickets = 100;
private Object lock = new Object();
//private Lock lock = new ReentrantLock();
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
//this可以替换lock
synchronized (lock) {
// lock.lock();
if(tickets > 0) {
try {
Thread.sleep(100*2);
String name = Thread.currentThread().getName();
System.out.println(name + "正在出售第" + tickets + "张票");
tickets--;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
// lock.unlock();
}
}
}
}
}
}
同步函数
语法:
使用方法:
示例:
package com.ycy5;
public class SellTicket2 implements Runnable {
private int tickets = 100;
private Object lock = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
synchronized (lock) {
sellTicket();
}
}
}
//同步函数
public synchronized void sellTicket() {
if (tickets > 0) {
try {
Thread.sleep(100 * 2);
String name = Thread.currentThread().getName();
System.out.println(name + "正在出售第" + tickets + "张票");
tickets--;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
}
}
}
同步总结
- 同步提升了安全性
- 同步降低了效率
- 任意的一个对象都可以作为锁对象
- 多个线程操作共享数据的锁对象必须是同一个锁,否则加锁无效。
- 在同步代码块中调用了sleep方法并不释放锁对象
- 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率