非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同步的情况,进而影响程序的执行流程。下面java培训用一个示例来学习一下如何解决非线程安全问题。
本案例模拟了多线程下的用户登录验证功能。首先编写一个类实现验证功能,LoginCheck类的代码如下:
packagech14;
publicclassLoginCheck
{
privatestaticStringusername;
privatestaticStringpassword;
publicstaticvoiddoPost(String_username,String_password)
{
try
{
username=_username;
if(username.equals("admin"))
{
Thread.sleep(5000);
}
password=_password;
System.out.println("username="+username+"password="+password);
}
catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
接下来创建线程类LoginThreadA和LoginThreadB,这两个线程都调用LoginCheck类进行登录信息。其中LoginThreadA类的代码如下:
packagech14;
publicclassLoginThreadAextendsThread
{
publicvoidrun()
{
LoginCheck.doPost("admin","admin");
}
}
LoginThreadB类的代码如下:
packagech14;
publicclassLoginThreadBextendsThread
{
publicvoidrun()
{
LoginCheck.doPost("root","root");
}
}
现在编写主线程程序,分别创建LoginThreadA线程实例和LoginThreadB线程实现,然后启动这两个线程。主线程的代码如下:
纯文本复制
packagech14;
publicclassTest07
{
publicstaticvoidmain(String[]args)
{
LoginThreadAa=newLoginThreadA();
a.run();//启动线程LoginThreadA
LoginThreadBb=newLoginThreadB();
b.run();//启动线程LoginThreadB
}
}