怎样解决线程的安全问题:
解决思路:
将多条线程操作的共享数据线程代码封装起来,当有线程在执行这些代码的时候,
其他的线程是不可以参与这个运算的,必须要等到当前的线程把这些代码都执行完毕后,
其他的线程才可参与运算。
在java中,是使用同步代码块的方式来解决这个问题的。
同步代码块的格式是:
synchronized(对象)
{
需要被同步的代码;
}
同步的好处:解决了线程的安全问题。
同步的弊端:相对来说,降低了运行的效率,因为同步以外的线程都会来判断同步锁。
小demo:(解决线程问题)
package com;
/**
* 需求:买票系统。一共有一百张火车票,同时有四个窗口卖着100张票。使用多线程的技术(也可以使用static方法)。
* @author 勇
*
*/
class Piao implements Runnable{//火车票类
private int num = 100;//定义一百张票
public void run() {
while(true){
synchronized (this) {
if(num>0){
try{Thread.sleep(10);}catch(Exception e) {e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+">>"+ num--);
}
}
}
}
}
public class Ticket {
public static void main(String[] args) {
Piao p=new Piao();
Thread t1=new Thread(p);
Thread t2=new Thread(p);
Thread t3=new Thread(p);
Thread t4=new Thread(p);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
解决思路:
将多条线程操作的共享数据线程代码封装起来,当有线程在执行这些代码的时候,
其他的线程是不可以参与这个运算的,必须要等到当前的线程把这些代码都执行完毕后,
其他的线程才可参与运算。
在java中,是使用同步代码块的方式来解决这个问题的。
同步代码块的格式是:
synchronized(对象)
{
需要被同步的代码;
}
同步的好处:解决了线程的安全问题。
同步的弊端:相对来说,降低了运行的效率,因为同步以外的线程都会来判断同步锁。
小demo:(解决线程问题)
package com;
/**
* 需求:买票系统。一共有一百张火车票,同时有四个窗口卖着100张票。使用多线程的技术(也可以使用static方法)。
* @author 勇
*
*/
class Piao implements Runnable{//火车票类
private int num = 100;//定义一百张票
public void run() {
while(true){
synchronized (this) {
if(num>0){
try{Thread.sleep(10);}catch(Exception e) {e.printStackTrace();}
System.out.println(Thread.currentThread().getName()+">>"+ num--);
}
}
}
}
}
public class Ticket {
public static void main(String[] args) {
Piao p=new Piao();
Thread t1=new Thread(p);
Thread t2=new Thread(p);
Thread t3=new Thread(p);
Thread t4=new Thread(p);
t1.start();
t2.start();
t3.start();
t4.start();
}
}