线程的同步方式有三种:
1.同步代码块
2.同步方法
3.lock方式
1.同步代码块:
格式如下:
synchronized (同步监视器){
//需要被同步的代码
}
说明:
操作共享数据的代码,即为需要被同步的代码
同步监视器:任何一个类的对象都可以充当锁
要求:多个线程必须同用一把锁
①在实现runnable接口创建多线程时方式中,可以考虑使用this充当同步监视器
②在继承Thread类创建多线程方式中慎用this充当同步监视器
可以考虑使用当前类充当同步监视器
2.同步方法:
原理:
将要执行的代码的方法写为:public synchronized void xxx(){}
格式
说明:
①要是继承Thread类创建多线程方式中,应考虑将同步方法声明为静态的
②同步方法仍涉及到同步监视器,只是不显示的声明
③非静态的同步方法中涉及到的同步监视器为this
静态的同步方法中涉及到的同步监视器是当前类的本身
- 3.Lock(锁):
从JDK5.0开始,Java提供了强大的线程同步机制-通过显示定义同步锁对象来实现同步.同步锁使用Lock对象充当.
举例:
private int ticket = 100;
private ReentrantLock lock1 = new ReentrantLock(true);
@Override
public void run() {
while (true) {
try {
//调用lock方法
lock1.lock();
if (ticket > 0 ){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":票号为:"+ticket);
ticket--;
}else break;
}finally {
//调用解锁的方法
lock1.unlock();
}
}
}
说明:
①ReentrantLock()可以定义空参的,也可以在参数内填入true
填入true后线程将按先后顺序依次进行
②Lock需手动的启动同步(lock()),同时结束同步也需要手动的实现(unLock())
③使用Lock,JVM将花费较少的时间来调度线程,性能更好.
并且具有更高的扩展性(提供更多子类)
开发中建议优先选用Lock同步方法,不仅效率高可扩展性好,还能很好的避免了死锁