синхронизированный метод запуска смешивает потоки [дубликат]

Функция base reshape работает отлично:

df <- data.frame(
  year   = c(rep(2000, 12), rep(2001, 12)),
  month  = rep(1:12, 2),
  values = rnorm(24)
)
df_wide <- reshape(df, idvar="year", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

Здесь idvar - столбец классов, который разделяет строки, timevar - столбец классов, который должен быть широко представлен, v.names - это столбец, содержащий числовые значения, direction указывает широкий или длинный формат, а необязательный аргумент sep - это разделитель, используемый между именами классов timevar и v.names на выходе data.frame. Если нет idvar, создайте его перед использованием функции reshape():

df$id   <- c(rep("year1", 12), rep("year2", 12))
df_wide <- reshape(df, idvar="id", timevar="month", v.names="values", direction="wide", sep="_")
df_wide

Просто помните, что требуется idvar! Часть timevar и v.names проста. Выход этой функции более предсказуем, чем некоторые другие, поскольку все явно определено.

7
задан Guillaume 5 October 2011 в 11:11
поделиться

1 ответ

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

Теперь, поскольку у вас есть два экземпляра вашего класса, каждый экземпляр получает свою собственную блокировку. Нет ничего, чтобы предотвратить одновременное использование обоих потоков в своем экземпляре одновременно.

Если вы хотите предотвратить это, вы можете иметь блок synchronized(obj) внутри run(), где obj будет объект, общий для обоих экземпляров вашего класса:

class MyThread2 implements Runnable {
   private static final Object lock = new Object();
   ...
   public void run() {
     synchronized(lock) {
       ...
     }
   }
}
28
ответ дан NPE 21 August 2018 в 13:21
поделиться
  • 1
    Спасибо за ответ – user980089 6 October 2011 в 17:19
  • 2
    Если у нас есть только один экземпляр класса и нескольких потоков, можно ли одновременно запускать некоторые методы synchronized? – Sajad 16 February 2014 в 00:04
  • 3
    @ssss: Конечно: static vs non static, используя блоки synchronized с разными замками и т. д. Если вам нужна дополнительная информация, отправьте новый вопрос. – NPE 16 February 2014 в 00:06
Другие вопросы по тегам:

Похожие вопросы: