Java多线程(五)之BlockingQueue深入分析

Java多线程(五)之BlockingQueue深入分析,第1张

一 概述

BlockingQueue作为线程容器 可以为线程同步提供有力的保障

二 BlockingQueue定义的常用方法

BlockingQueue定义的常用方法如下

抛出异常 特殊值 阻塞 超时

插入 add(e) offer(e) put(e) offer(e time unit)

移除 remove() poll() take() poll(time unit)

检查 element() peek() 不可用 不可用

)add(anObject) 把anObject加到BlockingQueue里 即如果BlockingQueue可以容纳 则返回true 否则招聘异常

)offer(anObject) 表示如果可能的话 将anObject加到BlockingQueue里 即如果BlockingQueue可以容纳 则返回true 否则返回false

)put(anObject) 把anObject加到BlockingQueue里 如果BlockQueue没有空间 则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续

)poll(time) 取走BlockingQueue里排在首位的对象 若不能立即取出 则可以等time参数规定的时间 取不到时返回null

)take() 取走BlockingQueue里排在首位的对象 若BlockingQueue为空 阻断进入等待状态直到Blocking有新的对象被加入为止

其中 BlockingQueue 不接受null 元素 试图add put 或offer 一个null 元素时 某些实现会抛出NullPointerException null 被用作指示poll *** 作失败的警戒值

三 BlockingQueue的几个注意点

【 】BlockingQueue 可以是限定容量的 它在任意给定时间都可以有一个remainingCapacity 超出此容量 便无法无阻塞地put 附加元素 没有任何内部容量约束的BlockingQueue 总是报告Integer MAX_VALUE 的剩余容量

【 】BlockingQueue 实现主要用于生产者 使用者队列 但它另外还支持Collection 接口 因此 举例来说 使用remove(x) 从队列中移除任意一个元素是有可能的 然而 这种 *** 作通常不 会有效执行 只能有计划地偶尔使用 比如在取消排队信息时

【 】BlockingQueue 实现是线程安全的 所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的 然而 大量的 Collection *** 作(addAll containsAll retainAll 和removeAll)没有 必要自动执行 除非在实现中特别说明 因此 举例来说 在只添加了c 中的一些元素后 addAll(c) 有可能失败(抛出一个异常)

【 】BlockingQueue 实质上不 支持使用任何一种 close 或 shutdown *** 作来指示不再添加任何项 这种功能的需求和使用有依赖于实现的倾向 例如 一种常用的策略是 对于生产者 插入特殊的end of stream 或 poison 对象 并根据使用者获取这些对象的时间来对它们进行解释

四 简要概述BlockingQueue常用的四个实现类

)ArrayBlockingQueue:规定大小的BlockingQueue 其构造函数必须带一个int参数来指明其大小 其所含的对象是以FIFO(先入先出)顺序排序的

)LinkedBlockingQueue:大小不定的BlockingQueue 若其构造函数带一个规定大小的参数 生成的BlockingQueue有大小限制 若不带大小参数 所生成的BlockingQueue的大小由Integer MAX_VALUE来决定 其所含的对象是以FIFO(先入先出)顺序排序的

)PriorityBlockingQueue:类似于LinkedBlockQueue 但其所含对象的排序不是FIFO 而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序

)SynchronousQueue:特殊的BlockingQueue 对其的 *** 作必须是放和取交替完成的

其中LinkedBlockingQueue和ArrayBlockingQueue比较起来 它们背后所用的数据结构不一样 导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue 但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue

五 具体BlockingQueue的实现类的内部细节

有耐心的同学请看具体实现类细节

ArrayBlockingQueue

ArrayBlockingQueue是一个由数组支持的有界阻塞队列 此队列按 FIFO(先进先出)原则对元素进行排序 队列的头部 是在队列中存在时间最长的元素 队列的尾部 是在队列中存在时间最短的元素 新元素插入到队列的尾部 队列检索 *** 作则是从队列头部开始获得元素

这是一个典型的 有界缓存区 固定大小的数组在其中保持生产者插入的元素和使用者提取的元素 一旦创建了这样的缓存区 就不能再增加其容量 试图向已满队列中放入元素会导致放入 *** 作受阻塞 试图从空队列中检索元素将导致类似阻塞

ArrayBlockingQueue创建的时候需要指定容量capacity(可以存储的最大的元素个数 因为它不会自动扩容)以及是否为公平锁(fair参数)

在创建ArrayBlockingQueue的时候默认创建的是非公平锁 不过我们可以在它的构造函数里指定 这里调用ReentrantLock的构造函数创建锁的时候 调用了

public ReentrantLock(boolean fair) {

sync = (fair)? new FairSync() : new NonfairSync()

}

FairSync/ NonfairSync是ReentrantLock的内部类

线程按顺序请求获得公平锁 而一个非公平锁可以闯入 且当它尚未进入等待队列 就会和等待队列head结点的线程发生竞争 如果锁的状态可用 请求非公平锁的线程可在等待队列中向前跳跃 获得该锁 内部锁synchronized没有提供确定的公平性保证

分三点来讲这个类

添加新元素的方法 add/put/offer

该类的几个实例变量 takeIndex/putIndex/count/

Condition实现

添加新元素的方法 add/put/offer

首先 谈到添加元素的方法 首先得分析以下该类同步机制中用到的锁

Java代码

[java]

lock = new ReentrantLock(fair)

notEmpty = lock newCondition() //Condition Variable

notFull =  lock newCondition() //Condition Variable

这三个都是该类的实例变量 只有一个锁lock 然后lock实例化出两个Condition notEmpty/noFull分别用来协调多线程的读写 *** 作

Java代码

[java]

public boolean offer(E e) {

if (e == null) throw new NullPointerException()

final ReentrantLock lock = this lock//每个对象对应一个显示的锁

lock lock() //请求锁直到获得锁(不可以被interrupte)

try {

if (count == items length)//如果队列已经满了

return false

else {

insert(e)

return true

}

} finally {

lock unlock() //

}

}

看insert方法

private void insert(E x) {

items[putIndex] = x

//增加全局index的值

/*

Inc方法体内部

final int inc(int i) {

return (++i == items length)? : i

}

这里可以看出ArrayBlockingQueue采用从前到后向内部数组插入的方式插入新元素的 如果插完了 putIndex可能重新变为 (在已经执行了移除 *** 作的前提下 否则在之前的判断中队列为满)

*/

putIndex = inc(putIndex)

++count

notEmpty signal() //wake up one waiting thread

}

Java代码

[java]

public void put(E e) throws InterruptedException {

if (e == null) throw new NullPointerException()

final E[] items = ems

final ReentrantLock lock = this lock

lock lockInterruptibly() //请求锁直到得到锁或者变为interrupted

try {

try {

while (count == items length)//如果满了 当前线程进入noFull对应的等waiting状态

notFull await()

} catch (InterruptedException ie) {

notFull signal() // propagate to non interrupted thread

throw ie

}

insert(e)

} finally {

lock unlock()

}

}

Java代码

[java]

public boolean offer(E e long timeout TimeUnit unit)

throws InterruptedException {

if (e == null) throw new NullPointerException()

long nanos = unit toNanos(timeout)

final ReentrantLock lock = this lock

lock lockInterruptibly()

try {

for ( ) {

if (count != items length) {

insert(e)

return true

}

if (nanos <= )

return false

try {

//如果没有被 signal/interruptes 需要等待nanos时间才返回

nanos = notFull awaitNanos(nanos)

} catch (InterruptedException ie) {

notFull signal() // propagate to non interrupted thread

throw ie

}

}

} finally {

lock unlock()

}

}

Java代码

[java]

public boolean add(E e) {

return super add(e)

}

父类

public boolean add(E e) {

if (offer(e))

return true

else

throw new IllegalStateException( Queue full )

}

该类的几个实例变量 takeIndex/putIndex/count

Java代码

[java]

用三个数字来维护这个队列中的数据变更

/** items index for next take poll or remove */

private int takeIndex

/** items index for next put offer or add */

private int putIndex

/** Number of items in the queue */

private int count

提取元素的三个方法take/poll/remove内部都调用了这个方法

Java代码

[java]

private E extract() {

final E[] items = ems

E x = items[takeIndex]

items[takeIndex] = null//移除已经被提取出的元素

takeIndex = inc(takeIndex) //策略和添加元素时相同

count

notFull signal() //提醒其他在notFull这个Condition上waiting的线程可以尝试工作了

return x

}

从这个方法里可见 tabkeIndex维护一个可以提取/移除元素的索引位置 因为takeIndex是从 递增的 所以这个类是FIFO队列

putIndex维护一个可以插入的元素的位置索引

count显然是维护队列中已经存在的元素总数

Condition实现

Condition现在的实现只有ncurrent locks AbstractQueueSynchoronizer内部的ConditionObject 并且通过ReentranLock的newCondition()方法暴露出来 这是因为Condition的await()/sinal()一般在lock lock()与lock unlock()之间执行 当执行condition await()方法时 它会首先释放掉本线程持有的锁 然后自己进入等待队列 直到sinal() 唤醒后又会重新试图去拿到锁 拿到后执行await()下的代码 其中释放当前锁和得到当前锁都需要ReentranLock的tryAcquire(int arg)方法来判定 并且享受ReentranLock的重进入特性

Java代码

[java]

public final void await() throws InterruptedException {

if (Thread interrupted())

throw new InterruptedException()

//加一个新的condition等待节点

Node node = addConditionWaiter()

//释放自己的锁

int savedState = fullyRelease(node)

int interruptMode =

while (!isOnSyncQueue(node)) {

//如果当前线程 等待状态时CONDITION park住当前线程 等待condition的signal来解除

LockSupport park(this)

if ((interruptMode = checkInterruptWhileWaiting(node)) != )

break

}

if (acquireQueued(node savedState) &&interruptMode != THROW_IE)

interruptMode = REINTERRUPT

if (node nextWaiter != null)

unlinkCancelledWaiters()

if (interruptMode != )

reportInterruptAfterWait(interruptMode)

}

SynchronousQueue

一种阻塞队列 其中每个 put 必须等待一个 take 反之亦然 同步队列没有任何内部容量 甚至连一个队列的容量都没有 不能在同步队列上进行 peek 因为仅在试图要取得元素时 该元素才存在 除非另一个线程试图移除某个元素 否则也不能(使用任何方法)添加元素 也不能迭代队列 因为其中没有元素可用于迭代 队列的头 是尝试添加到队列中的首个已排队线程元素 如果没有已排队线程 则不添加元素并且头为 null 对于其他Collection 方法(例如 contains) SynchronousQueue 作为一个空集合 此队列不允许 null 元素

同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道 它非常适合于传递性设计 在这种设计中 在一个线程中运行的对象要将某些信息 事件或任务传递给在另一个线程中运行的对象 它就必须与该对象同步

对于正在等待的生产者和使用者线程而言 此类支持可选的公平排序策略 默认情况下不保证这种排序 但是 使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问 公平通常会降低吞吐量 但是可以减小可变性并避免得不到服务

LinkedBlockingQueue

一个基于已链接节点的 范围任意的 blocking queue 此队列按 FIFO(先进先出)排序元素 队列的头部 是在队列中时间最长的元素 队列的尾部 是在队列中时间最短的元素 新元素插入到队列的尾部 并且队列检索 *** 作会获得位于队列头部的元素 链接队列的吞吐量通常要高于基于数组的队列 但是在大多数并发应用程序中 其可预知的性能要低

单向链表结构的队列 如果不指定容量默认为Integer MAX_VALUE 通过putLock和takeLock两个锁进行同步 两个锁分别实例化notFull和notEmpty两个Condtion 用来协调多线程的存取动作 其中某些方法(如remove toArray toString clear等)的同步需要同时获得这两个锁 并且总是先putLock lock紧接着takeLock lock(在同一方法fullyLock中) 这样的顺序是为了避免可能出现的死锁情况(我也想不明白为什么会是这样?)

PriorityBlockingQueue

一个无界的阻塞队列 它使用与类 PriorityQueue 相同的顺序规则 并且提供了阻塞检索的 *** 作 虽然此队列逻辑上是无界的 但是由于资源被耗尽 所以试图执行添加 *** 作可能会失败(导致 OutOfMemoryError) 此类不允许使用 null 元素 依赖自然顺序的优先级队列也不允许插入不可比较的对象(因为这样做会抛出ClassCastException)

看它的三个属性 就基本能看懂这个类了

Java代码

[java]

private final PriorityQueue q

private final ReentrantLock lock = new ReentrantLock(true)

private final Condition notEmpty = lock newCondition()

lock说明本类使用一个lock来同步读写等 *** 作

notEmpty协调队列是否有新元素提供 而队列满了以后会调用PriorityQueue的grow方法来扩容

DelayQueue

Delayed 元素的一个无界阻塞队列 只有在延迟期满时才能从中提取元素 该队列的头部 是延迟期满后保存时间最长的 Delayed 元素 如果延迟都还没有期满 则队列没有头部 并且 poll 将返回 null 当一个元素的getDelay(TimeUnit NANOSECONDS) 方法返回一个小于或等于零的值时 则出现期满 此队列不允许使用 null 元素

Delayed接口继承自Comparable 我们插入的E元素都要实现这个接口

DelayQueue的设计目的间API文档

An unbounded blocking queue of Delayed elements in which an element can only be taken when its delay has expired The head of the queue is that Delayed element whose delay expired furthest in the past If no delay has expired there is no head and poll will returnnull Expiration occurs when an element s getDelay(TimeUnit NANOSECONDS) method returns a value less than or equal to zero Even though unexpired elements cannot be removed using take or poll they are otherwise treated as normal elements For example the size method returns the count of both expired and unexpired elements This queue does not permit null elements

因为DelayQueue构造函数了里限定死不允许传入parator(之前的PriorityBlockingQueue中没有限定死) 即只能在pare方法里定义优先级的比较规则 再看上面这段英文 The head of the queue is that Delayed element whose delay expired furthest in the past 说明pare方法实现的时候要保证最先加入的元素最早结束延时 而 Expiration occurs when an element s getDelay(TimeUnit NANOSECONDS) method returns a value less than or equal to zero 说明getDelay方法的实现必须保证延时到了返回的值变为<= 的int

上面这段英文中 还说明了 在poll/take的时候 队列中元素会判定这个elment有没有达到超时时间 如果没有达到 poll返回null 而take进入等待状态 但是 除了这两个方法 队列中的元素会被当做正常的元素来对待 例如 size方法返回所有元素的数量 而不管它们有没有达到超时时间 而协调的Condition available只对take和poll是有意义的

另外需要补充的是 在ScheduledThreadPoolExecutor中工作队列类型是它的内部类DelayedWorkQueue 而DelayedWorkQueue的Task容器是DelayQueue类型 而ScheduledFutureTask作为Delay的实现类作为Runnable的封装后的Task类 也就是说ScheduledThreadPoolExecutor是通过DelayQueue优先级判定规则来执行任务的

BlockingDque+LinkedBlockingQueue

lishixinzhi/Article/program/Java/gj/201311/27544

"朝花夕拾、不留遗憾。念念不忘,必有回响。"

通过通读tomcat请求任务处理、tomcat线程池、TaskQueue、ReentrantLock以及AQS的源码,以及对它们的功能和原理的了解,我们就可以分析tomcat线程dump里边的蛛丝马迹了。

另外关于样本三,由于没有实验重现问题进而证明推断,请多持怀疑态度。

这个情况很简单,本地启动tomcat以后jstack就可以看到,没太多好讲的,我们快速过一遍。

"http-nio-8081-exec-xx"这样的线程有10个,是线程池coreSize的大小。看上面的几个关键地方, TaskQueue.take 这是一个无超时阻塞,从任务队列里出队,线程数少于核心线程Size的时候,用take方法出队。

往上看此时take阻塞在 ConditionObject.await 其内部是使用的 LockSupport.park 实现的阻塞。源码里可以看到这个Condition是notEmpty,也就是当前队列是空的,核心线程都等待notEmpty这个条件满足,然后竞争任务队列里的takeLock(ReentrantLock非公平锁,基于AQS排他模式实现),拿到锁之后拿任务出队然后执行。

这种情况发生在业务高峰过后,正常情况应该会释放部分空闲线程,进入一个平衡点,或者在业务极少的时候比如半夜会进入样本一状态。

简单提两句, LinkedBlockingQueue.poll 我们知道线程数大于coreSize的时候,任务队列出队会用poll而不是take,接下来 ConditionObject.awaitNanos 我们去看一下TaskQueue和LinkedBlockingQueue的源码也会知道这还是阻塞在notEmpty条件上、只不过这次是超时阻塞,也就是说线程池设置的keepalive最大空闲时间之内没有被使用的话,该线程最终会走向终结。至于有时候为什么这类线程要经过很久的一个缓慢释放过程,我们在 tomcat的worker线程的空闲判定与释放 - (jianshu.com) 里做了较为详细的分析。

373个这样处于WAITING的http-nio-8081-exec线程:

一个处于RUNNABLE的线程:

我们这次重点分析一下这个样本三。当时的情形,笔者回忆也是个业务高峰,这个springboot tomcat应该是进程还在、端口也通,但是请求基本不响应了的一个“假死”状态。

样本三和样本二是从awaitNanos之后开始不同的。awaitNanos(long nanosTimeout)这个方法是在LinkedBlockingQueue里边poll(timeout)的时候先拿锁,然后等待在notEmpty这个Condition这个条件上,调用notEmpty.awaitNanos(nanos),notEmpty是队列的ReentrantLock takeLock这个重入锁上的Condition。

LinkedBlockingQueue的poll(timeout)方法:

我们接着去 awaitNanos 里边看看:

接下来我们先跳跃一下,去看看任务队列的入队逻辑,从LinkedBlockingQueue的offer方法开始:

上面的 signalNotEmpty() 最终会执行到 transferForSignal(Node node) 方法里,这个就是把线程(对应的Node)从条件队列转移到同步队列的 *** 作。

分析这2个方法要了解AQS的原理,从poll里边的count.get() == 0线程进来以后,进入了条件队列排队,然后释放了takeLock,就钻到 while (!isOnSyncQueue(node)) 这个循环里了、超时之前不断判断自己有没有在同步队列里,也就是等任务队列有入队了,非空了,条件队列里边的线程都会被移到同步队列里头排队重新获取takeLock然后干活。

样本三的线程栈上可以看出来,线程跳出了while循环,来到了 if (acquireQueued(node, savedState) &&interruptMode != THROW_IE) ,也就是说,队列里有入队了而且应该是至少300多个,这些原来等待在条件队列的线程被转移到了同步队列等待获取takeLock干活了!我们继续,进入acquireQueued:

到此,我们大致知道了流程:notEmpty条件不满足就先阻塞在takeLock.condition上,满足了以后,由于是非公平锁就先tryAcquire拿一次锁、如果成则去拿队列任务执行,没拿到就进同步队列排队拿锁、除了第一个外其余park等前序唤醒。

从线程栈上看这300+个线程就属于是在AQS同步队列里park等待前序节点唤醒再去拿锁的这种场景。

笔者设想了如下两个可能出现上述情况的场景:

1、非公平锁模式下,300+个线程,某个386号线程由于某种原因,每次都抢到锁。tomcat任务队列是jdk LinkedBlockingQueue的子类,出队锁takeLock就是非公平锁。386号是当前持有锁的线程,poll完之后takeLock.unlock()释放锁并unpark同步队列中自己后继节点了,自己接下来去执行task任务了。然后跟后继节点是可以一起来poll ->tryAcquire来抢锁的。 然后又是它抢到了。

杂(jvm线程栈分析、jdkbug引发socketRead0阻塞、jvm调优等) - 肥兔子爱豆畜子 - 博客园 (cnblogs.com)

可能的情况:386线程一直处于RUNNABLE状态,系统将调度优先给这个线程,其他同步队列的线程得不到时间片抢不到锁。然后386线程由于上述jdk bug又执行不完一直处于这个状态。所以整个进程假死。

2、任务队列里任务一下来了非常之多的任务,然后之前条件队列里的线程都满足了notEmpty条件去抢锁然后拿任务,然后也是按照同步队列里的顺序一个接着一个的唤醒去拿锁然后拿任务执行请求业务逻辑。刚好jstack的时候这些在同步队列里的且还没被唤醒的park线程被采集到线程栈了。

请求任务源源不断的的入队(TaskQueue),worker线程就会一直满足notEmpty的Condition而进入到AQS同步队列里、排队、park,这样只要入队的速度大于出队的速度(这里指AQS同步队列),那么就会产生上面300+个线程排队获取TaskQueue的ReentrantLock$NonfairSync锁的现象了。

这就其实是所谓的性能瓶颈了,任务队列里产生了大量积压(所以tomcat新请求来了没响应假死、实际上是进到任务队列排队去了,而且队非常之长),后面的工作线程AQS排队去拿takeLock然后一个个的执行队列里的任务却怎么也执行不完,队列太长了。

如果是2这种情况,那不应该是从awaitNanos进去,后续一直worker线程忙于处理的话,应该是count.get() != 0,然后直接出队,就是park也应该是从takeLock.lockInterruptibly()进去走acquireQueued。

所以从线程栈上来看,是一种线程先空闲从条件队列瞬间移动到同步队列、然后300+大部分没抢到锁的线程进入park,然后抢到锁的386线程一直占用CPU时间片(虽然笔者还不了解更底层的线程调度原理来证明这种线程饥饿的情况),其他线程没机会去抢锁运行这样一个瞬时里发生的事情。

所以,笔者目前倾向是一个jdk bug导致的一个线程长期占用cpu,其他大量线程饥饿park阻塞的情形。

全名:Justin Randall Timberlake (中文名:贾斯汀·兰德尔·汀布莱克)

生日: 1981年1月31日 (6:30 PM)

星座:水瓶座

出生地:美国田纳西州孟菲斯市(Memphis-Tennessee)

小名:跳跳(Bounce)、卷毛(Curly)、宝宝(the Baby)

家庭成员:Lynn Harless(母亲),Paul Harless(继父),Randy Timberlake(生父),Lisa Timberlake(继

母),Jonathan (弟弟),Steven(弟弟)

(注:Justin原本有个和他龙凤胎的妹妹Laura Katherine的,不过Laura在出生后不久便夭折了)

身高:1.83米

眼睛的颜色:蓝

鞋号:美码11/12 (即45-46号)

优点:是个好听众

兴趣:篮球、游泳

坏习惯:打嗝

在学校时最不喜欢的科目: 数学

Justin的名言:原爱、和平、和睦与大家同在。很棒吧!Love,peace and harmony for all!!

令Justin脸红的事:被赞美

宠物:早期养过一条狗(Ozzie)、一只猫(Ally),现在已经不在了。目前的宠物是两条拳师狗,名字分别是Buckley和Brennan.

最自豪自己身体的那部分:手

最讨厌自己那部分:头发,因为太卷了

最想改变自己的…:耐心,拖拉

最害怕的动物:蜘蛛,鲨鱼,蛇,.

最喜欢的节日:圣诞节

最喜欢的颜色:淡蓝(Baby Blue)

最喜爱的食物:意大利通心粉、喜瑞儿

最喜欢的糖果:Carmello

最喜欢的饮品:牛奶

喜欢的艺人:Michael Jackson, Stevie Wonder, Janet Jackson, Jeff Buckley ,Baby Face, Boyz II Men, Brian McKnight, Prince, Jimi Hendrix, Coldplay James Brown, Marvin Gaye, Michael Jordan

影响Justin最大的人:Brian McKnight, Take 6

最喜欢的歌曲:Never Felt This Way (by Brian McKnight)

最喜欢的电影:《春天不是读书天》(Ferris Bueler's Day Off)

最喜欢的男演员:布拉德皮特(Brad Pitt)

最喜欢的女演员:珊卓布拉克(Sandra Bullock),梅格.瑞恩(Meg Ryan)

最喜欢的作家:John Grisham

最喜欢的书:《线索》(Clue)

最喜欢的运动:篮球,高尔夫

最喜欢的体育明星:迈克尔.乔丹(Michael Jordan)

最喜欢的篮球队:North Carolina Tarheels

最喜欢的大学:美国北卡罗来纳州大学

最喜爱用语:Crunk!(疯狂的意思)

最喜欢收集的东西:篮球服和运动鞋,Justin目前已经拥有超过500双

最喜欢的Pizza 品牌:Pepperoni

最喜欢的内衣品牌:Tommy Hilfiger

最恐惧的事:死时没人爱

做过最心虚的事:骗老师

做过最大胆的事:高空d跳

自己的慈善机构:The Justin Timberlake Foundation

身上的文身身及含义:共七个,具体图案及含义见此:

http://tieba.baidu.com/justin/tupian/list/Justin%B5%C4%CE%C4%C9%ED%BC%B0%BA%AC%D2%E5

Justin出生在田纳州的孟菲斯,父亲是Randall Timberlake,母亲是Lynn.他的祖先是英国人.他的祖父Charles L. Timberlake,是美国浸信会的一位神职者,Timberlake从小就深受浸信会信仰的熏陶, 尽管他自己觉得自己和"宗教化"比起来更"精神化"但他仍然是一位基督教徒.他的父母在1985年离婚,之后又都有再婚.他的母亲,在Justin5岁时嫁给了Paul Harless,一位银行家.她现在在帮助Justin经营他自己的娱乐公司"JustinTime Entertainment"他的生父,一位唱诗班的指挥,再和Lisahas结婚后又拥有了两个孩子,Jonathan (出生于1993年)和Stephen (出生于1998年),他还有个同父异母的妹妹,名叫Laura Katherine,可惜的是她在1997年出生后不久便夭折了,Justin还专门在自己的唱片感谢词中以"My Angel in Heaven"这个名字来称呼并提及他的妹妹.

Justin成长在孟菲斯北部的一个叫Millington的小城里,他第一次在歌唱方面的崭露头角是在一个叫"Star Search"的电视节目中,那时他以 "Justin Randall"的名字报名参加并演唱了一些乡村风格的歌曲.而他真正感觉自己"出名了"是在1993年,他成功从5000多个孩子中脱颖而出,加入了"米老鼠俱乐部"(一个相当受欢迎的电视节目).在那里他遇到了他未来的女朋友,流行巨星Britney Spears(布兰妮),未来是巡演伙伴Christina Aguilera,还有未来的组合搭档JC Chasez.这个节目在1995由于一些原因而停办。

年少的Justin在“米老鼠俱乐部”节目停办后回到了Memphis,在去了Nashville后不久,马上和JC一起录了一些示范带并且试着寻求出唱片的机会。在1995年Justin接到了一个改变了他一生命运的电话.....

序幕:

一切始于美国音乐年轻偶像之城佛罗里达的奥兰多,在这片年轻人的梦乐园中,5个帅气的大男孩也在计划共同打造一个音乐界的奇迹! 这5个男孩和音乐之间的故事听起来似乎很平凡,但发生在他们身上却是一点也不寻常。他们并不是由知名的音乐经纪公司发掘组团,而是自发、单纯的为了音乐在方面的共同兴趣而组成乐团,所有他们所做的一切皆出于对音乐的喜爱。

组团经过:

1996年,五个极具天赋的男孩开始了一次可能改变世界的音乐旅程。他们来自美国不同的地方,可能是纯属偶然也有可能是命运的安排走到了一起,组成了历史上最成功的男孩团体。旅程从佛罗里达州的奥兰多开始,其间经历了挣扎、快乐、痛苦、当然还有最终大获成功后的幸福。这个由5位成员名字的最后一个字母组成的这个男孩团体,完美地诠释了他们曼妙的和声以及惊艳的舞蹈动作。

每个想获得成功的年轻人都会经历一番艰苦的奋斗,但'NSync的形成仅仅由电话开始。传媒界大亨Lou Pearlman在佛罗里达的环球影城看到Chris Kirkpatrick的一场表演后,给Chris提供了一份难以拒绝的合约:由他来找几个年轻人,组成一个演唱团体。Chris当即就同意了并马上投入行动,开始向四处打电话为这个团体物色有特色的声音。

电话打给了Justin Timberlake,Chris把这个机会告诉他,并说想听听他的一些作品。这时Justin离开米老鼠俱乐部(下简称MMC)之后已经有一阵子了,正急于回到所热爱的表演事业中,他的母亲Lynn剪辑了一段他在MMC时的表演录象寄给Chris。Chris看过后非常喜欢,立刻叫Justin乘飞机来奥兰多——Justin成了组合的一员。接着,Justin向Chris推荐了他在MMC认识的伙伴JC Chasez,认为JC将非常适合,Chris很感兴趣,叫Justin打电话给JC。此时的JC正在打算过“平凡”的生活——进大学读书;他接到Justin的电话后犹豫不已,父亲的建议让他打定了主意,父亲说“你肯定不想以后回想起这事时,无奈地对自己说‘真希望当时我至少尝试过’”。于是,JC参加了面试,很顺利地成为了又一名成员。他们继续寻觅下一个目标。当时,Joey Fatone正要在环球影城的BeatleJuice Graveyard回顾节目中进行表演,这么年轻的男孩能参与这样的活动非常难得,他们打电话找到他,之后,Chris,JC,Justin,Lou Pearlman在Joey表演的那天去观看了演出,Joey的表演打动了他们,一致认为他应该加入,于是,这个演唱团体有了第四个成员。 四个年轻人开始一起练唱,尽管Lou Pearlman觉得他们不错,但是他们自己并不满意,认为声音组合还不完整,需要一个男低音。 Joey找来了朋友、曾经的同学Jason Watkins,他的到来完善了组合的和声。然而Jason不喜欢这个团体将来的发展方向,也不喜欢他们要练的舞蹈,所以当Lou Pearlman要和五个人签合同时,他退出了。

在父母们的支持下,Chris,JC,Joey,Justin签了这份合同,合同中还写明他们可以为团体找到第五个成员、一个能唱出低音F调的年轻男低音。由于之前Jason的到来让他们以为这个组合终于完整了,所以已经安排好一场见面会,而现在仅有两周时间让他们去找一个新的男低音。他们面试了30个孩子,直到Justin在MMC时的声乐老师、孟菲斯人Bob Westbrook给他们推荐了16岁的Lance Bass,他说Lance是真正的男低音,只是他的母亲不会同意让儿子加入......这次Lynn打了电话,接电话的是Lance的母亲Diane Bass,过后Diane告诉儿子这件事,但她并不希望他参加,毕竟Lance还小、正在读11年级。那天Lynn又打电话来游说,再加上Bob Westbrook的再三保证,Diane最终还是答应和Lance一起飞去奥兰多,但只是让儿子“试一试”,以为母子俩很快就会回来、忘了这回事。然而她并未如愿,Lance的男低音让另外四个男孩非常惊异,当天晚上就开始讨论合同的事情,Lance和他的母亲此时明白他已经是这个团体的成员了。终于,'NSync(超级男孩)正式诞生。

'NSync业已成型,Lou开始安置他们,在佛罗里达为他们买了套房子,在这里Chris,JC,Joey,Justin和Lance在一起工作、生活、玩耍。Lou还给他们津贴以及在这个年龄的男孩所需要的一切:篮球场,电子游戏机等等,但是在这里居住不光是玩乐,还要有很多东西要去学习。前MMC的声乐老师Robin Wiley教其中一个男孩唱歌,另外四个则在一旁玩电玩;这个男孩上完课后再换一个来上课,刚上完课的则接着去打电玩。训练还包括18小时的节目排练;房子里有一面墙上醒目地贴着他们的工作日程安排。要使所有这一切:男孩们的玩乐和工作,能顺利地进行下去,有一个办法——不仅使他们成为工作伙伴,同时也是朋友、家人。 利用Justin和JC在MMC时收到的歌迷来信,他们寄出了很多宣传单为将在Pleasure Island举行的*NSYNC见面会做宣传。尽管这是他们首次集体登台亮相,但这个夜总会仍被挤得满满当当。Justin和JC,以前在MMC有过非常丰富的表演经验,对摄象机和闪光灯已经很适应了,Joey和Lance也表现得比较正常,但Chris却始终非常紧张。他们最终还是完成了这场见面会,并且找来市场顾问Michael Schweiger,让他负责在纽约寻找肯为'NSync出唱片的大唱片公司,但很不走运,这些唱片公司都拒绝了他,因为他们认为现在市场只能有一个男孩团体,那就是Backstreet Boys。

1996年,Johnny Wright在德国为一些演出活动当经纪人。当时Johnny还有另一项工作,为BMG唱片公司寻找新面孔。他收到了'NSync的两首歌曲的母带,上面还有他们的照片;Johnny和Jan Bolz(BMG慕尼黑分公司的总监,负责为公司挖掘新人)一起听过后要亲眼看看这五人的表演,再决定是否签下他们。Johnny立刻乘飞机到奥兰多,和'NSync第一次会面,告诉他们这个机会,以及他们要准备什么。为此,男孩们在一个大仓库里无休无止地进行排练,即便到了晚上10点,仍可以看到他们在里面排练舞蹈。他们持续艰苦排练直到正式表演的时刻到来,Jan Bolz看过他们的表演后非常喜欢,觉得他们很有发展潜力,同意签下'NSync,只是......还有一些附加条件——首先,他想改掉'NSync这个团体名称,认为人们很难理解这名字的意思,而且对于他这样有浓重德语口音的人来说这个词太难念了;另外,他想换掉Lance,觉得Lance的舞蹈和其余四个成员比起来显然不够好。男孩们和Johnny对这两条附加条件都表示反对。对于改名,Johnny说,一旦人们认识了'NSync,就不会忘了这个团体的名字;Johnny还允诺不久后Lance的舞蹈就能赶上其他成员。Jan Bolz被说服了,放弃这些附加条件,'NSync正式与慕尼黑的BMG Ariola唱片公司签约。Johnny被Lou聘为经纪人,'NSync从此走上了正轨。

如今的'NSync手上已经有了唱片合约,还有了个经纪人,五个男孩觉得这一切都难以置信,为此惊喜不已。此时的美国,Nirvana、Pearl Jam这样的乐队统治着各大音乐排行榜,而流行乐在欧洲却很受欢迎,'NSync决定先去欧洲发展更为明智;Justin时年13岁,Lance也才15,所以他们的母亲Lynn和Diane陪同着*NSYNC来到了欧洲。他们在欧洲开始了巡回演出,同时还录制自己的唱片,有了自己的表演舞台。他们的第一首单曲"I Want You Back"发行三周后,即出现在排行榜的前十名;第二首单曲"Tearin' Up My Heart"巩固了之前所取得的成绩,*NSYNC接着发行了首张专辑,发行第二天就名列销量榜首位。Justin生日那天他们得知专辑已经达到了黄金销量;随之而来的是,'NSync成为众多德国杂志的封面人物,他们在大街上常会被认出来,甚至被尖叫着的女歌迷围追堵截......男孩们的足迹走遍了欧洲37个国家,在一年里开了近300场演唱会,为团体、为唱片不停地做宣传,有时一个月30天居然没有一天得到休息,幸运的时候他们可以在晚上睡上四、五个小时,Chris每天晚上都会打电话给母亲诉苦;然而,无论怎样的艰苦和劳累,在五个男孩对成功的渴望下,什么都不能阻止他们。男孩们都消瘦了,时常感到精疲力竭,他们自己并不在意,但是同行的两位母亲却很心疼,Lynn打电话给唱片公司,抗议说如果不能保证每周一天的休息日,她就带着儿子Justin回美国去,她成功了,为大家争取到了宝贵的休息时间。

就在那段时期,Vincent Degiorgio正在欧洲为美国RCA唱片公司寻找新人,他在布达佩斯看了一场'NSync的演出后,很快决定他们就是他所要找的,并成功说服其与RCA签约。1998年,已成为RCA旗下演唱团体的'NSync在无数歌迷的簇拥下离开欧洲,来到美国迎接他们的却是空荡荡的机场,毕竟当时他们的知名度还仅限于欧洲。回到美国后,在RCA开始准备录制'NSync首张专辑的美国版本,尽管他们很喜欢欧洲版本,但第二次录制时还是决定做些改变,加一点更符合美国歌迷口味的新歌;最后RCA发行的美国版本'NSync同名专辑中换掉了欧洲版里的四首歌。专辑刚开始卖得并不好,人们还很少有机会看到这五个男孩长什么样。Chirs的母亲Bev当时在沃尔玛超市工作,她的老板有个兄弟,在当地一家电台任职,正是这位兄弟在沃尔玛的停车场为'NSync办了一场小型演出,它取得了意想不到的效果:超过两千名观众来到停车场观看了演出,反响很热烈,以至于男孩们表演结束后不得不停留了4个小时为每个观众签名。

快到1998年年末的时候,迪士尼打算办一场特别演唱会,负责找演出歌手的迪士尼总监Tina Treadwell一开始想到的是后街男孩,但后街男孩拒绝了。她为此与一些唱片公司电话联系时,RCA发行部的Elaine Shock给她推荐了'NSync,并且寄给她'NSync的照片和歌曲,Tina把这些转交给她的老板;不久她就通知Elaine:迪士尼希望让'NSync来出演这次演唱会,条件是他们能在24小时内签下这份合约。'NSync同意了,这也许是他们事业发展过程中最重要的决定之一。签下合约后,他们非常匆忙地为还有三周就要举行的演唱会做准备,他们想办成一场真正的演唱会——在此之前他们还未办过真正的大型演唱会,所以找来舞蹈老师Darrin Henson进行合作。在这三周里,迪士尼为这场演出卖力宣传,从而也使'NSync专辑的销量大增。对于这场重要的演出,男孩们都很紧张,但演出进行得很顺利:整个公园都被挤满了,整个舞台只属于'NSync。演出时有乐队现场演奏而不是放背景音乐,这证明了他们现场表演的功力。这场演唱会举行的时机也非常好,为'NSync在美国的初次登场亮相打响了头炮。演唱会后的六周里,他们的专辑热卖50万张,挤进唱片销量榜的前十,有一度甚至排到了第二。'NSync的同名美国版专辑到现在为止获得了钻石销量,也就是总共卖出了超过1千万张,其中共诞生了四首冠军单曲:"I Want You Back","Tearin' Up My Heart","God Must Have Spent A Little More Time On You"以及"I Drive Myself Crazy" 。98年年底的时候,他们不断接到演出邀请,其中,Janet Jackson的"Velvet Rope Tour"也邀请他们去登台表演。"Velvet Rope Tour"只有10场演出,而且演出嘉宾得不到报酬,但'NSync还是答应了,他们在这巡演中造成了不小的轰动。*NSYNC的下一张专辑是轻松的圣诞专辑"Home For Christmas",它获得了多白金的销量。1999年对于'NSync来说是非常重要的一年,但是在发行寄予重望的第三张专辑前,他们陷入了与经纪人的官司中。

1998年年末,在纽约梅西百货感恩节大游行那天,Lance的母亲Diane提出一个问题:'NSync需要多久才能开始真正赚到钱;在团体刚刚建立的时候,他们签的是一份“标准”合同。现在他们觉得有必要更改下这份合同,并同唱片公司进行了磋商,可是几个月后也没有结果。于是男孩们认为这份合同并不公正,应当被终止,然而他们仍然保留Johnny作为经纪人。RCA唱片公司立刻起诉违约。'NSync这时挑战的是一家大唱片公司,这场官司无疑将会影响团体的未来;他们是在为收入、自由甚至'NSync这个名字打官司。一开始官司进展对团体很不利,大伙已经感到灰心丧气了——事业刚刚有了起色,现在被迫拖入官司中,而且他们也不愿为了这场官司与最初的老板Lou Pearlman发生不快;然而,这就是生意场。尽管官司还在进行,Johnny建议,他们应该继续录制下一张专辑,以恢复士气,新专辑也可以在官司了结时发行。不过他们得先为新专辑寻找新的唱片公司。

Johnny为此着手与其它唱片公司联系,但是这些唱片公司看到'NSync正纠缠于这样麻烦的官司中,觉得不值得再花本钱把他们挖过来。只有Jive例外,Jive很看好'NSync,愿意签下他们。最终'NSync的律师想办法促成了这次签约:把'NSync由RCA转到JIVE旗下。RCA和Lou Pearlman开始想办法通过法律途径阻止JIVE为'NSync发行下一张新专辑。除此之外,还有另一个麻烦,就是"'NSync”这个团名能否继续使用也成了问题,因为Lou声明这个名称的所有权归他所有。RCA和Lou Pearlman企图通过这一系列行动告诉'NSync,他们决不会善罢甘休,直到毁掉这个团体为止。99年感恩节前的周三进行的听证会上,大量'NSync的歌迷集结在法院外,给予支持。最后,法官否决被告的申请,裁定JIVE有权为'NSync发行新专辑。'NSync在这场官司中大获全胜。

在第三张专辑No Strings Attached发售后不久,'NSync便创造了一个新的流行音乐记录。专辑中的第一首单曲bye bye bye是一首Urban味十足且富有他们恰倒好处的和声的快节奏歌曲,同时这也成为了热门当代单曲电台的有史以来播放率最高的单曲。舞蹈老师Darrin Henson为这首歌想出了一个标志性的舞蹈动作:这个用一只手模仿一个一张一合的嘴巴的动作象征着对这个组合拒绝者的一种打击,而一个甩动的拳头则体现出他们的力量!2000年3月21日,在成功推出单曲“Bye Bye Bye”后,这张专辑正式发行,发行首日便卖出超过100万张,一周后卖出超过240万张,均打破了唱片史发行首日和首周的销售记录。专辑中从"Bye Bye Bye" "It's Gonna Be Me"等快歌到 "This I Promise You"这样的抒情慢歌都体现了NSync的成长。JC在专辑的四首歌曲中参与了创作,显示了他创作上的才华。热门单曲"Bye Bye Bye"在当年的格莱美中获得了“年度最佳单曲”的提名。之后他们的巡演也同样的成功:本来计划40多天卖完的门票在不到10分钟的时间里被一抢而空!这又一次创造了记录。演唱会在各地都有很好的票房。

2001年,NSync回到录音棚录制专辑“celebrity”。这张专辑和他们之前典型的男孩组合风格非常不同,但仍然突出'NSync招牌式的和声,和声甚至成为专辑中的一部分,这是以往专辑所没有的。“celebrity”还有个变化是,Justin和JC更多地参与进歌曲的创作和制作中,这使他们在团体中的地位更突出了。'NSync这次得以与更多著名音乐制作人合作,创作出极具感染力的节奏、传神的歌词的歌曲吸引歌迷,因而在专辑发行前,就有很好的口碑。第一首单曲“POP”在整张专辑中非常突出,其mv在MTV音乐台和TRL排行榜的成绩都很好。接下来发行的单曲"Gone"和"Girlfriend"也广受歌迷好评。2001年7月21日,“celebrity”正式发行,它再次证明'NSync的实力,这帮男孩不仅能演唱、能跳舞,而且也能创作。专辑又一次大卖特卖,随后,'NSync为新专辑进行巡演。

2001年的“POPODYSSEY”巡回演唱会不仅表演“celebrity”中的热门歌曲,也有以往专辑中歌迷喜爱的曲子。演唱会从曲目顺序、小道具、舞台等的设置到舞蹈的编排都非常精细。五个团员也从每一个方面协助巡演的进行,编舞、音响、道具、灯光等等各方面都考虑到了,保证到现场来的歌迷能够值回票价,他们也做到了,巡演非常成功。在它之后他们又举行了一次巡演——CelebrityTour。这次巡演相比较而言更加低调一些,能够让小伙子们更注重音乐性而不用担心场景和舞蹈编排等。

此时的'NSync在多年不停的努力后换过了唱片公司,赢得了无数的荣誉(其中包括全美音乐奖,MTV音乐录影带奖,与Gloria Estefan合唱的曲子在奥斯卡上获得提名),在这些成就后,尽管歌迷们仍旧热切期待着他们更多的精彩表现,五个男孩还是想休息了。'NSync中的每一个成员都很为自己是团体中的一员而自豪,但是他们开始在各方面独立发展,从演戏到唱歌,从在百老汇表演到设计服装,无论他们做什么,相信凭着一贯的毅力和信心,结果都不会让他们失望。

当CelebrityTour结束后,所有的五个成员决定休息一下并且利用空闲时间进行其他活动。对于Justin来说,这意味着设立JustinTimberlake基金会。这个慈善活动是为了在音乐及艺术方面更好地资助学校,这也是Justin的一个发自内心的愿望。然而,作为一个十足的表演者,Justin无法忍受长时间的与歌唱隔绝.....

PS:2003年7月,'NSync又重聚在一起参加每年举行的名为"Challenge For The Children" 的慈善篮球赛。这次活动集结了大批娱乐明星,酬到三百五十万美元的善款.

Justin显然不喜欢就这么闲着,他有着他的想法:发一张个人专辑。2002年的八月,在经过数月的录音之后,Justin在VMA上表演了他的新单曲“Like I Love You”。这支率先打头阵的首支电台播放冠军单曲,由The Neptunes *** 刀制作,感觉带有些许乐坛怪杰王子Prince所可能有的即兴音乐色彩。“我知道这并非一张让人一听即上瘾的作品,你得听上几遍才能深入其境,”Justin说道。“我觉得这首歌是最值得发表的作品,因为它树立了这张专辑的风格。是一首绝对的节奏蓝调作品,有着嘻哈的元素,但同时也带有摇滚的感觉。”这首歌在Billboard排行榜的最好成绩为11名,在这支单曲后JT在2002年11月5日推出了自己的单飞首张专辑<<Justified>>。

在拥有'NSync这样一个强势后盾做为背书的情形下,Justin本大可轻松地照本宣科,将超级男孩那赢得全盘胜利的音乐公式照抄一番地带入他的个人专辑中,然而Justin自信地表示:“我不想在五年后回顾过往,后悔今天没有尝试一些与众不同的东西。”也因此,歌迷有幸得以在他的首张个人代表作品中,惊喜地感受到他竟能尝试如此多样化且互异的音乐元素。从热情充满活力的节奏蓝调、嘻哈音乐、摇滚到蓝调、乡村…等各类型的音乐特色,都被灵活地运用、反映在其作品中,充份地崭露出这位出生自美国田纳西州孟菲斯市的超级偶像的音乐才情,尽管当时年仅21岁,但其音乐的触角却已极度完美地朝全方位发展。Justin示,“我并未刻意要创作出某些新的声音来,我只是写下我所渴望听见的东西,并且自过去取得灵感。”而他确实也已藉由亲自参与《Justified》专辑中全部收录的13 首作品的创作,再一次地证明了他在词曲创作方面的惊人天赋。

《Justified》发行后在全球造成巨大震撼,发行首周就登上美国Billboard Album 200排行榜亚军;英国先是首周打入第六,在一首首畅销单曲《Like I Love You》、《Cry Me A River》、《Rock Your Body》三首英国亚军曲攻势下,一月首度冲向榜首蝉连两周,二月、五月、六月又多次抢回排行王座,总计《Justified》专辑一共前后七度占领榜首,是当年英国歌坛最畅销专辑!Justin在音乐上的表现同样被全美MTV音乐奖肯定,《Cry Me A River》获“最佳流行录影带”、“最佳男歌手”外,又以《Rock Your Body》赢得“最佳舞曲”,成为当年最大赢家;九月贾斯汀以白人的身份击败亚香缇、碧昂丝等强劲对手,得到英国黑人音乐MOBO音乐奖“最佳R&B艺人”肯定,之后,Justin超人气除了先在全美人气指标的Teen Choice Awards撂下三座大奖外,更击败贝克汉姆被“Company”杂志票选为“全球最性感男人”。之后在2003年Billboard年终榜称霸“最畅销新进艺人”、“最热门主流艺人”以及“最热门舞曲艺人”等3大类别统计总冠军,还为他赢得两座格莱美奖“最佳流行男歌手”“最佳男歌手演唱专辑”.Justin通过这张专辑成功的从男孩团体时代中顺利脱颖而出,成为当今歌坛炙手可热的音乐金童。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11215044.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存