JAVA线程同步实例教程
线程是Java程序设计里非常重要的概念,本文就以实例形式对此加以详细解读。具体分析如下:
首先,线程加锁有什么用处呢?举个例子:比如你现在有30000块大洋在银行存着,现在你到银行取钱,当你输入密码完成后,已经输入取款金额,比如你输入的是20000,就是在银行给你拿钱这个时刻,你老婆也去银行取这笔钱,你老婆同样取20000,因为此时你的账上仍然是30000,所以银行同样的操作在你老婆那端又进行了一遍,这样当你们两个完成各自操作后,银行记录的你账上还应该有10000块存款,这样是不是很爽。解决这个问题就用到了线程加锁的知识,下面就让我们一起来学习一下吧。
一、未处理线程同步的一个例子:
publicclassTextSyncimplementsRunnable{
/**未处理线程同步
*@paramargs
*/
Timetime=newTime();
publicstaticvoidmain(String[]args){
TextSynctext=newTextSync();
Threadt1=newThread(text);
Threadt2=newThread(text);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
publicvoidrun(){
time.add(Thread.currentThread().getName());
}
}
classTime{
privatestaticintnum=0;
publicvoidadd(Stringname){
try{
num++;
//当第一个线程执行到此时,num变成了1,第一个线程暂停一秒,
//第二个线程开始执行,当第二个线程执行到此时,num变成了2,第二个线程暂停一秒,
//第一个线程此时的num同样变成了2,所以最终的结果均为2;
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(name+"是第"+num+"个执行的线程。");
}
}
输出结果:
t2是第2个执行的线程。 t1是第2个执行的线程。
二、线程同步
publicclassTextSynctwoimplementsRunnable{
/**线程同步
*@paramargs
*/
Time1time=newTime1();
publicstaticvoidmain(String[]args){
TextSynctwotext=newTextSynctwo();
Threadt1=newThread(text);
Threadt2=newThread(text);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
publicvoidrun(){
time.add(Thread.currentThread().getName());
}
}
classTime1{
privatestaticintnum=0;
//synchronized锁定当前线程,可以在方法定义时进行声明,或采用在方法中进行设置。
publicsynchronizedvoidadd(Stringname){
//synchronized(this){//锁定当前线程,防止此时被别的线程执行
try{
num++;
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(name+"是第"+num+"个执行的线程。");
//}
}
}
输出结果:
t1是第1个执行的线程。 t2是第2个执行的线程。
三、死锁
publicclassTestDeadLockimplementsRunnable{
/**死锁
*@paramargs
*/
privateintflag=0;
staticObjecto1=newObject();
staticObjecto2=newObject();
publicstaticvoidmain(String[]args){
TestDeadLocktd1=newTestDeadLock();
TestDeadLocktd2=newTestDeadLock();
td1.flag=1;
td2.flag=2;
Threadt1=newThread(td1);
Threadt2=newThread(td2);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
@Override
publicvoidrun(){
System.out.println(Thread.currentThread().getName());
if(flag==1){
synchronized(o1){
try{
Thread.sleep(5000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}
}
}
if(flag==2){
synchronized(o2){
try{
Thread.sleep(5000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
synchronized(o1){
System.out.println("2");
}
}
}
}
}
四、锁定
publicclassTTimplementsRunnable{
/**锁定
*@paramargs
*/
intb=100;
publicstaticvoidmain(String[]args){
TTtt=newTT();
Threadth=newThread(tt);
th.start();
try{
tt.m2();
}catch(Exceptione){
e.printStackTrace();
}
System.out.println(tt.b);
}
@Override
publicvoidrun(){
try{
m1();
}catch(Exceptione){
e.printStackTrace();
}
}
privatesynchronizedvoidm1()throwsException{
b=1000;
Thread.sleep(5000);
System.out.println("b="+b);
}
privatesynchronizedvoidm2()throwsException{
Thread.sleep(2500);
b=2500;
}
}
现在的输出结果是:
1000 b=1000
可见这里m2先执行,m1要等m2执行完毕后方可执行。
希望本文所述对大家的Java程序设计有所帮助