вторник, 29 сентября 2009 г.

Знакомьтесь - Дмитрий Вьюков

Дмитрий Вьюков является постоянным читателем Блога. Мы с ним списались, вот что он пишет о себе:

Первое знакомство с атомарными переменными

Стоит взглянуть для начального знакомства на описание пакета java.util.concurrent.atomic в javadoc.
Работа с атомарными переменными также приводит к установлению отношения happend-before между потоками. Детальнее смотрите по ссылке выше.

Микро-курс по concurrency от SUN

Тут микро-курс по concurrency от SUN. Даже с двумя упражнениями в конце :). Стоит прочитать.
P.S. Кстати тут и тут просто множество коротеньких курсов от SUN по разнообразным базовым темам из Явы.

Материалы по lock-free

Тут в Вики статья "Non-blocking synchronization". Обратите внимание на различия в Wait-freedom, Lock-freedom и Obstruction-freedom.
Тут в Вики часть статьи "Lock" с подзаголовком "The problems with locks".
Тут на русском, тут на английском статья "Введение в неблокирующие алгоритмы". Рассматриваются:
- Неблокирующий счетчик
- Неблокирующий стек Трайбера (Treiber)
- Неблокирующая очередь Майкла-Скотта (Michael-Scott)

P.S. Именно очередь Майкла-Скотта использована в java.util.concurrent.ConcurrentLinkedQueue. Там в javadoc так и написано "This implementation employs an efficient "wait-free" algorithm based on one described in Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms by Maged M. Michael and Michael L. Scott.".

Lock-free BlockingStack

Дмитрий Вьюков в комментах спрашивает "А слабо к этому стеку прикрутить блокирующую семантику, что бы pop() на пустом стеке блокировался до появления элемента, и так что бы стек оставался lock-free пока есть элементы?". Отвечаю - не слабо:

понедельник, 28 сентября 2009 г.

Заметка о теоретических основах многопоточности

Было бы странно, если бы каждая корпорация, группа и т.д., занимающаяся развитием систем основанных на многопоточности, каждый раз изобретала велосипед. В 1989 году стартовала конференция Concure (Concurrency Theory) на которой обсуждаются теоретические основы многопоточности и их применение. Эта конференция, преимущественно, каждый год проходит в новой стране. В этом году она проходила в Болонье (Италия).
http://concur09.cs.unibo.it/
Цитата: "CONCUR 09, the 20th International Conference on Concurrency Theory, will take place in Bologna, on September 1-4, 2009. The purpose of the CONCUR conferences is to bring together researchers, developers, and students in order to advance the theory of concurrency, and promote its applications. "
Материалы всех конференция можно найти в интернет-магазине infibeam.com. Если удастся найти материалы или обзор в свободном доступе, обязательно выложу хотя бы те направления, которые на данный момент являются наиболее перспективными.


воскресенье, 27 сентября 2009 г.

Еще книги по Java Concurrent Programming

Еще книги по Java Concurrent Programming:
1) Грегори Р. Эндрюс "Основы многопоточного, параллельного и распределенного программирования" (есть у Игоря в djvu, у Ивана и Романа - в бумажном виде). Отличная книга, стоит иметь на книжной полке. Я купил в Буксе за 40 гривен. Много теории не привязанной к конкретному языку, более 250 упражнений (вообще великолепно:)). Настоящий университетский учебник.
2) "Java Thread Programming" by Paul Hyde Sams © 1999, 510 pages, ISBN: 0672315858. Очень хорошая книга для старта. Автор разбирает большинство моментов программирования потоков именно на яве. Вот оглавление:
Part I        Threads
Chapter 1 - Introduction to Threads
Chapter 2 - A Simple Two-Thread Example
Chapter 3 - Creating and Starting a Thread
Chapter 4 - Implementing Runnable Versus Extending Thread
Chapter 5 - Gracefully Stopping Threads

лекция #2: NonBlockingStack

Реализация неблокирующего стека на java.util.concurrent.atomic.AtomicReference:
import java.util.concurrent.atomic.AtomicReference;
import java.util.EmptyStackException;

class NonBlockingStack {
private AtomicReference head = new AtomicReference(null);
public void push(int data) {
for (; ;) {
Node next = (Node) head.get();
Node myNode = new Node(data, next);
if (head.compareAndSet(next, myNode)) {
return;
}
}
}

суббота, 26 сентября 2009 г.

лекция #2: BoundedBuffer

Реализации ограниченного буфера
1) с использованием synchronized/wait()/notifyAll()
2) с использованием Lock/Condition
3) тест
Обе реализации получены модификацией исходного кода класса java.util.concurrent.ArrayBlockingQueue.

A Survey of Concurrency Constructs

В презентации от SUN "A Survey of Concurrency Constructs" рассматриваются различные подходы в утилизации многоядерности + перечисляются плюсы/минусы каждого подхода:
- Threads/Locks
- Actors
- Dataflow
- Tuple spaces

concurrency-interest

Тут (concurrency-interest archive), пожалуй, один из лучших источников информации относительно всего, что касается многопоточности/многоядерности для java.
В данной переписке, например, авторы java.util.concurrent обсуждают собственную библиотеку.

Matlab: Parallel Computing Toolbox 4.2

В Matlab, как оказалось, можно
1) параллелить приложения с помощью Parallel Computing Toolbox, data sheet
2) растягивать на кластер с помощью Distributed Computing Server, data sheet

Я работал одно время на Матлабе, простой втроеный язык M, возможность компилировать программы в исполнимый код, возможность писать методы на C, возможность использовать java прямо в Матлабе. +естественно, куча математических библиотек и неповторимая визуализация чего-угодно из матфизики.

В Группу добавлены Роман Николаенко и Игорь Волков.

    В Kharkov Concurency Group добавилось два человека.
    Авторами блога KharkovConcurencyGroup.blogspot.com теперь являются Головач Иван, Роман Николаенко, Игорь Волков.
    Я, Головач Иван, теперь буду постить новости от своего имени (не от KhCGroup).

    P.S. Роман и Игорь - примите приглашения на своих gmail-ящиках.

пятница, 25 сентября 2009 г.

лекция #2: словарь

    На лекции #2 пополнили словарь:
- conditional waiting
- Producer-Consumer pattern
- Push or Pop model
- Bounding Buffer
- atomic variables (java.util.concurrent.atomic.*)
- CAS: compareAndSwap
- non-blocking algorithms

лекция #2: Thread.State

    У класса Thread есть метод getState(), который возвращает State, который может иметь значения:
"A thread state. A thread can be in one of the following states:
  • NEW
    A thread that has not yet started is in this state.
  • RUNNABLE
    A thread executing in the Java virtual machine is in this state.
  • BLOCKED
    A thread that is blocked waiting for a monitor lock is in this state.
  • WAITING
    A thread that is waiting indefinitely for another thread to perform a particular action is in this state.
  • TIMED_WAITING
    A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.
  • TERMINATED
    A thread that has exited is in this state.
A thread can be in only one state at a given point in time. These states are virtual machine states which do not reflect any operating system thread states."

лекция #1: happend-before

    Отношение Happend-Before устанавливается в нескольких случаях. Мы рассмотрели 3 из них (не все):
    1. Если один поток записал в volatile переменную, а другой считал из нее же (две записи, два чтения, чтение потом запись не устанавливают отношние).
    2. Если один поток выполнил Thread.start(), а второй - это стартонувший поток. Если один поток вышел из своего метода run() а второй ожидал его окончания по Thread.join().
    3. Если один поток освободил монитор объекта(вышел из синхронизированной секции), а второй захватил монитор того же объекта (вошел в синхронизированную секцию).

лекция #1: java.lang.Thread, java.lang.Runnable

    У класса java.lang.Thread использовались на лекции методы:
- Thread.start()
- Thread.run()
- Thread.join()
- Thread.sleep(1000)

    Использовался интерфейс java.lang.Runnable.

Что читать в интернете

    1. Для отслеживания современного состояния J2EE рекомендуется просматривать infoq.com, либо уже infoq.com/java. Рекомендуется просматривать у новостей заголовки, читать избранное.
    2. Для представления о том, что такое современное высокопроизводительное, маштабируемое, параллельное, устойчивое web- или enterprise- приложение рекомендуется читать статьи с highscalability.com. Есть описание архитектур google.com, amazon.com, ebay.com, etc.

лекция #1: словарь

Словарь, введенный на первой лекции:
ordering / reordering
visibility
casuality
atomicity
temporal logic
mutual exclusion
memory barrier
write barrier
read barrier
cache flush
fire
strong fire
weak fair
thread affinity

лекция #1: принципы группы

1. Открытость. Двери семинара всегда открыты. Никакой платы, никакой регистрации. Никаких ограничений по возрасту, по специальности, по ВУЗу. Информация должна быть бесплатной.
2. Честность. Никокой лжи и обмана, никаких манипуляций внутри группы. Плагиат жестоко карается.
3. Равноправие. Структура группы горизонтальна, все равноправны, отсутствуют лидеры, менеджеры, вожди.