多线程的好处:cpu利用效率高,可以缩短程序执行时间,提高程序执行效率和性能。
如何解决多线程下的数据共享(安全)问题?
主要用到synchronized对象同步锁机制。
一般来说,我们都是通过Runnable去实现多线程。如果我们不使用同步锁,那么在对共享数据进行操作时就会出现:当第1个线程想操作A状态的数据时,发现已经被第二个线程修改为了B状态,于是无法完成本想完成的任务。比如售票,假如我们票数固定,当我们同时开启三个线程进行售票。就可能会出现我线程1还未执行完,但是我线程2抢到了cpu资源,在线程1执行了一部分的时候执行了线程2,最终导致线程1和线程2卖出的是同一张票。这个就是我们常遇到的线程数据安全问题,通常通过synchronized(对象同步锁来解决)。
那么synchronized如何实现呢?
public class MyRunnable implements Runnable {
// 在成员变量位置将票定义为数字100
/**
* @Fields number :票数
*/
private int number = 100;
public void run() {
/**
* @Title: run
* @Description: 完成卖票的线程逻辑
* @see java.lang.Runnable#run()
*/
// 车站不停地在卖票
while (true) {
synchronized (this) {
// 有票就买票
if (number > 0) {
System.out.println(Thread.currentThread().getName() + "正在销售第" + (number--) + "张票");
} else {
// 没有票,就跳出循环,不再卖票
System.out.println("卖完了");
break;
}
}
}
}
}
public class MyRunnableDemo {
/**
* @Title: main
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param args
*/
public static void main(String[] args) {
MyRunnable MyRunnable1 = new MyRunnable();
Thread thread1 = new Thread(MyRunnable1);
Thread thread2 = new Thread(MyRunnable1);
Thread thread3 = new Thread(MyRunnable1);
thread1.start();
thread2.start();
thread3.start();
}
}
如果一个线程已经进入该对象锁执行,那么下一个线程会等待当前线程执行完毕后在进入同步代码块。保证一次只有一个线程运行同步代码块,来保证数据准确性。