Ik ben al een tijdje bezig met een Software Transactioneel geheugen implementatie speciaal voor Java:
http://code.google.com/p/multiverse/
Het is voornamelijk bedoelt om inzichten op te doen (en om te experimenteren met erg interessante techieken). Maar ik denk dat STM/HTM wel een belangrijke tool in de toolbox kunnen worden voor concurrency control. Old school concurrency is gewoon te lastig.
Probeer het volgende maar eens te doen met old school concurrency:
Of nu met een orElse:
Gaan slapen op waitssets van verschillende locks is niet mogelijk.
Of anders dit:
Zorgen dat dit atomic is en isolated (dus ook geen observatie mogelijk is dat het item op geen van beide queues zit) is al een drama.
Het is de bedoeling dat mbv instrumentatie normale pojo's deel uit kunnen maken van een STM. Zie de site voor een voorbeeld hoe eenvoudig het zou kunnen zijn om concurrent code te schrijven.
Verder zitten er wel een paar leuke zaken in zoals de mogelijkheid tot flashback queries, geen kosten voor immutable structuren, readers don't block writers en andersom, transaction level read consistency, etc. Ik ga waarschijnlijk op JSpring 2009 een presentatie erover geven.
In code dat atm nog niet in subversion zit ben ik al begonnen met een efficientere heap implementatie waarbij bv de updates (herbalanceren) over meerdere cores verdeeld kan worden of waar je het herbalanceren wat minder strikt gaat doen. Is allemaal via interfaces gescheiden van de implementatie en bij de implementaties via policies te tunen.
http://code.google.com/p/multiverse/
Het is voornamelijk bedoelt om inzichten op te doen (en om te experimenteren met erg interessante techieken). Maar ik denk dat STM/HTM wel een belangrijke tool in de toolbox kunnen worden voor concurrency control. Old school concurrency is gewoon te lastig.
Probeer het volgende maar eens te doen met old school concurrency:
code:
1
2
3
4
5
6
7
8
9
10
11
| atomic{ Object item = queue1.peek(); if(item != null) return item; item = queue2.peek(); if(item != null) return item; retry(); } |
Of nu met een orElse:
code:
1
2
3
4
5
6
7
| atomic{ { return queue1.pop(); }OrElse{ return queue2.pop(); } } |
Gaan slapen op waitssets van verschillende locks is niet mogelijk.
Of anders dit:
code:
1
2
3
| atomic{ toQueue.push(fromQueue.pop()); } |
Zorgen dat dit atomic is en isolated (dus ook geen observatie mogelijk is dat het item op geen van beide queues zit) is al een drama.
Het is de bedoeling dat mbv instrumentatie normale pojo's deel uit kunnen maken van een STM. Zie de site voor een voorbeeld hoe eenvoudig het zou kunnen zijn om concurrent code te schrijven.
Verder zitten er wel een paar leuke zaken in zoals de mogelijkheid tot flashback queries, geen kosten voor immutable structuren, readers don't block writers en andersom, transaction level read consistency, etc. Ik ga waarschijnlijk op JSpring 2009 een presentatie erover geven.
In code dat atm nog niet in subversion zit ben ik al begonnen met een efficientere heap implementatie waarbij bv de updates (herbalanceren) over meerdere cores verdeeld kan worden of waar je het herbalanceren wat minder strikt gaat doen. Is allemaal via interfaces gescheiden van de implementatie en bij de implementaties via policies te tunen.
[ Voor 69% gewijzigd door Alarmnummer op 12-02-2009 08:15 ]