黑马程序员 java中的线程个人总结

------- <ahref="http://edu.csdn.net/heima" target="blank">android培训</a><ahref="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------

进程是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。

线程就是进程中的一个独立控制单元,线程控制着进程的执行,一个进程至少有一个线程。Java虚拟机启动时会有一个进程java.exe,该进程至少有一个线程负责java的执行,jvm启动不止一个线程,其中垃圾回收机制可能也在运行。

getName()用于获取线程名称;设置线程名称用setName()

实现方式和继承的区别:实现可以避免单继承的局限性。定义线程时使用实现方式。

继承Thread,线程代码存放在子类run方法中;实现Runnable,线程代码存放在接口子类的run方法中。

对象如同锁,持有锁的线程可以在同步中执行;没有持有锁的线程即使获取cpu的执行权也进不去,因为没有锁。

同步的前提:1、必须要有两个或两个以上的线程;2、必须是多个线程使用同一个锁。

同步的好处:解决了多线程的安全问题;同步的弊端:多个线程需要判断锁,较为消耗资源。

写同步要明确几点:一是哪些代码是多线程运行代码;二是哪些是共享数据;三是多线程运行代码中哪些语句是操作共享数据的。

同步可修饰代码块,也可修饰函数。函数需要被对象调用,那么函数都有一个所属对象引用,就是this,则同步函数使用的锁是this

waitnotify()notifyAll(),都使用在同步中,因为要对监视器(锁)的线程操作,所以要使用在同步中,只有同步才具有锁。这些方法在操作同步中线程时,都必须标识它们所操作线程的锁,只有同一个锁上的等待线程,可以被同一个锁上的notify()唤醒,不可以对不同锁中的线程进行唤醒。

等待和唤醒必须是同一个锁,而锁可以是任意对象,可以被任意对象调用的方法定义在Object类中。

JDK1.5中提供了多线程升级解决方案:将同步synchronized替换成显式Lock操作,将Object中的waitnotifynotifyAll替换成了condition对象。该对象可以被Lock锁,进行获取。

join的用法:当A线程执行到了B线程的.join()方法时,A就会等待。等B线程执行完,A才会执行。join可用来临时加入线程执行。

如果同步函数被静态修饰后,使用的锁是该方法所在类的字节码文件,类名.class

静态进内存时内存中没有本类对象,但一定有该类对应的字节码文件对象。

懒汉式特点是延迟加载,问题是容易出现安全问题,解决办法是加同步解决。

用同步代码块较低效,用双重否定可解决效率问题。

请写一个单例设计模式下的延迟加载实例:

If(s==null)

{

       synchronized(single.class)

       {

              if(s==null)

                     s=new single();

}

}

class Single

{

       private static Single s=null;

       private Single()

       {|

       }

       public static Single getInstance()

       {

       If(s==null)

       {

              synchronized(Single.class);

{

           if(s==null)

                  s=new Single();

}

}

}

}

请写一个死锁程序:

class Test

{

       private boolean flag

       Test(boolean flag)

       {

       this.flag=flag;

}

public void run()

{

       if(flag)

       {

       synchronized(Mylock.locka)

       {

              System.out.println(“iflocka”);

              synchronized(Mylock.lockb)

              {

                     System.out.println(“iflockb”);

}

}

}

else

{

       synchronized(Mylock.lockb)

       {

              System.out.println(“elselockb”);

              synchronized(Mylock.locka)

              {

                     System.out.println(“elselocka”);

}

}

}

}

}

class Mylock

{

       static Object locka=new Object();

       static Object lockb=new Object();

}

classDeadLockTest

{

       public static void main(String[] args)

       {

              Thread t1=new Thread(newTest(true));

              Thread t1=new Thread(newTest(false));

       t1.start();

       t2.start();

}

}

------- <ahref="http://edu.csdn.net/heima" target="blank">android培训</a><ahref="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值