同步处理:
所谓的同步指的是所有的线程不是一起进入到方法中执行,而是按照顺序一个一个来。
synchronized处理同步问题
使用synchronized关键字处理有俩种模式:同步代码块、同步方法。
使用同步代码块必须设置一个要锁定的对象,所以一般可以锁定当前对象this。
eg:
class MyThread implements Runnable{
private int n = 100;
@Override
public void run() {
for (int i = 0;i < 100;i++){
//表示在同一时刻只能允许一个线程进入代码块;
//为程序逻辑上锁
synchronized (this){
if (this.n > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"余量还有"+ this.n--);
}
}
}
}
}
public class TestDemo {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt,"A").start();
new Thread(mt,"B").start();
new Thread(mt,"C").start();
}
}
这种方式是在方法里拦截的,也就是说进入到方法中的线程依然会有多个。
eg:使用同步方法
class MyThread implements Runnable{
private int n = 100;
@Override
public void run() {
for (int i = 0;i <100;i--){
try {
this.sale();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void sale() throws InterruptedException {
if (this.n > 0){
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "余量还有:" + this.n--);
}
}
}
public class TestDemo {
public static void main(String[] args) {
MyThread mt = new MyThread();
new Thread(mt,"A").start();
new Thread(mt,"B").start();
new Thread(mt,"C").start();
}
}
实际上,synchronized(this)以及非static的synchronized方法,只能防止多个线程用时执行一个对象的同步代码块,即:synchronized锁住的是对象,而不是代码。
对于非static的synchronized方法,锁住的是对象本身,就是this。
同步虽然可以保证数据的完整性(线程安全操作),但是其执行速度会很慢。
要使用synchronized锁住一段代码,应该锁住多个对象的同一方法,
例如:synchronized(Test.class)
这种锁相当于实现了全局锁的效果,锁的是类,而不是this。