A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘一尘 中级黑马   /  2015-10-29 00:57  /  300 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

六、 Synchronized关键字
1、原理
  在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。
  当当前线程调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj),当前线程就获取了“obj这个对象的同步锁。
  不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。
2、基本规则
  第一条 :  当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对该对象的该“synchronized方法或者“synchronized代码块的访问将被阻塞。
  第二条 :  当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问该对象的非同步代码块
  第三条 :  当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对该对象的其他的“synchronized方法或者“synchronized代码块的访问将被阻塞。
3、实例锁和全局锁
实例锁 -- 锁在某一个实例对象上。如果该类是单例,那么该锁也具有全局锁的概念。
               实例锁对应的就是synchronized关键字。
全局锁 -- 该锁针对的是类,无论实例多少个对象,那么线程都共享该锁。
               全局锁对应的就是staticsynchronized(或者是锁在该类的class或者classloader对象上)。
  就是说,一个非静态方法上的synchronized关键字,代表该方法依赖其所属对象。一个静态方法上synchronized关键字,代表该方法依赖这个类本身。
七、线程优先级和守护线程  
1、线程优先级  
  java中的线程优先级的范围是1~10,默认的优先级是5。每个线程默认的优先级都与创建它的父线程具有相同的优先级。默认情况下,mian线程具有普通优先级。“高优先级线程”会优先于“低优先级线程”执行。Thread提供了setPriority(intnewPriority)和getPriority()方法来设置和返回线程优先级。
  Thread类有3个静态常量:
——MAX_PRIORITY= 10
——MIN_PRIORITY= 1
——NORM_PRIORITY= 5
2、守护线程
  java 中有两种线程:用户线程守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程”。
用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的是:Java虚拟机在“用户线程”都结束后会后退出。
  守护线程又称“后台线程”、“精灵线程”,它有一个特征——如果所有前台线程都死亡,后台线程自动死亡
  通过setDaemon(true)来设置一个线程。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马