2016-07-22 9 views
0

При программировании с использованием класса ThreadLocal, должно ли поле объявляться окончательным? , если код записи private ThreadLocal<String> threadLocal и инициализировать его позже в конструкторе, так как переменная threadLocal больше не может быть изменена, я думаю, что она равна private final ThreadLocal<String> threadLocal;. Эта идея правильная? В чем разница между следующим методом в многопоточном классе?Должно ли threadlocal объявлено как окончательное поле

public class ThreadLocalTestForMultiThread{ 
     private ThreadLocal<String> threadLocal; 
     public ThreadLocalTestForMultiThread(){ 
      threadLocal = new ThreadLocal<String>(); 
     } 
    } 

    public class ThreadLocalTestForMultiThread{ 
     private final ThreadLocal<String> threadLocal; 
     public ThreadLocalTestForMultiThread(){ 
      threadLocal = new ThreadLocal<String>(); 
     } 
    } 
+1

Ваш второй пример не должен компилироваться. – Codebender

+0

@Codebender, да, вы правы, не очень думали об этом – lawrence

+0

Поскольку вы новичок здесь, не забудьте принять ответ, всякий раз, когда это помогло самому. См. Также http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work. –

ответ

1

Bottomline является то, что вы не должны иметь final на ThreadLocal, но вы, скорее всего, не только final, но и static на нем.

Когда вы работаете с переменными ThreadLocal, атрибут заметного ключа такой переменной имеет экземпляр на поток. Кроме того, вы должны предоставить реализацию метода initialValue(), чтобы класс знал, как построить новый объект, когда это необходимо.

Обратите внимание, что если у вас есть нормальная переменная уровня класса, подразумевается, что такая переменная будет иметь копию в соответствии с экземпляром. В реальном мире у вас не будет слишком много приложений, чтобы иметь ThreadLocal в соответствии с конкретным случаем; и, скорее всего, у вас есть это на уровне class, то есть static. Таким образом, он почти наверняка инициализируется в блоке static или сразу.

+0

если писать код как частный ThreadLocal threadLocal и инициализировать его в конструкторе позже, так как переменная threadLocal ссылка больше не может быть изменена, я думаю, что она равна частному финалу ThreadLocal threadLocal; это идея? – lawrence

+0

Да эквивалент. –

0

Использование final или static на переменной ThreadLocal управляется теми же мыслями, что и использование их на любой другой переменной.

  1. Когда следует использовать final?

Ключевое слово final используется для переменной, которая может быть назначена только один раз. А в случае глобального он должен быть назначен непосредственно при объявлении или в конструкторе.
В случае ThreadLocal это делает в смысле 99% случаев. Поскольку обычно вы не будете изменять экземпляр ThreadLocal, вы только измените ссылочный Object на ThreadLocal#set(T value).

  1. Когда использовать static?

static переменные связанно с владеющими Class, а не к Object. Это означает, что все экземпляры Class используют одну и ту же переменную static.
Если ThreadLocal объявлен как static это ThreadLocal переменной (а также ссылки о ThreadLocal) разделяется всеми Objects-владельца Class.