Bounded Buffer
4.4. Bounded Buffer
Bounded buffer merupakan suatu struktur data yang mampu untuk menyimpan beberapa nilai dan mengeluarkannya kembali ketika diperlukan. Jika dianalogikan bounded buffer ini akan mirip dengan sebuah tumpukan piring. Kita menaruh piring dan menaruh lagi sebuah piring, ketika ingin mengambil piring maka tumpukan yang paling atas yang akan terambil. Jadi piring terakhir yang dimasukan akan pertama kali diambil.
Pada bagian ini akan dicontohkan suatu produser konsumer. produser akan menghasilkan suatu barang dan konsumer akan mengkonsumsi barang yang dihasilkan oleh produser. produser dan konsumer ini akan mengakses bounded buffer yang sama. produser setelah menghasilkan suatu barang dia akan menaruh barang itu di bounded buffer sebaliknya konsumer ketika membutuhkan suatu barang, dia akan mengambilkannya dari bounded buffer.
Hal yang harus diperhatikan dalam contoh program ini bahwa: • Bounded buffer memiliki batas banyaknya data yang dimasukan.
• Barang yang dikonsumsi oleh konsumer terbatas. • Jika bounded buffer telah penuh produser tidak mampu menaruh lagi dan akan menunggu sampai ada tempat
yang kosong. • Jika bounded buffer kosong maka konsumer harus menunggu sampai ada barang yang ditauh oleh produser.
Gambar 4-11. Bounded buffer dengan sinkronisasi
/** contoh penggunaan bounded buffer author [email protected]
**/ public class ContohBoundedBuffer {
public static void main(String args[]) {
BoundedBuffer buffer = new BoundedBuffer(); Produser prod = new Produser(buffer); Consumer con = new Consumer(buffer);
prod.start(); con.start();
/** *struktur data yang akan digunakan untuk menyimpan data */
class BoundedBuffer {
//deklarasi variabel int data[]; int penunjuk; boolean bisa;
public BoundedBuffer() {
data= new int[4]; penunjuk =0; bisa = true;
} public int getData()
{ try {
while( penunjuk < 0 ) wait();
int dataKe = penunjuk; penunjuk-=1; bisa = true; System.out.println("pointer buffer menunjuk ke:"+penunjuk); return data[dataKe];
} catch(Exception e) {
return -1; }
} public void inputData(int sesuatu)
{ try {
penunjuk+=1; if(penunjuk > 3)
bisa = false; while(!bisa)
wait(); wait();
} catch(Exception e) { }
class Produser extends Thread {
//deklarasi variabel BoundedBuffer buffer;
public Produser(BoundedBuffer aBuffer) {
buffer = aBuffer; }
public void run() {
int i=0; for(int ij=0;ij<10;ij++) {
i++; try {
buffer.inputData(i); System.out.println("memasukan nilai sebesar:"+i); sleep(30);
} catch(Exception e) {
System.exit(0); }
class Consumer extends Thread {
//deklarasi variabel BoundedBuffer buffer;
public Consumer(BoundedBuffer aBuffer) {
buffer = aBuffer; }
public void run() {
int i=0; int i=0;
try {
i=buffer.getData(); System.out.println("mengambil nilai:"+i); sleep(30);
} catch(Exception e) {
System.exit(0); }
Seperti yang terlihat pada contoh program diatas. Jika bounded buffer kosong maka produser akan berhenti sejenak dan menunggu sampai ada konsumer yang mengkonsumsi. Sebaliknya jika bounded buffer kosong maka konsumer akan menunggu sampai bounded buffer disi oleh produser.
Pada contoh program ini yang harus diperhatikan adanya kemungkinan terjadinya deadlock. Yaitu keadaan dimana produser dan konsumer saling menunggu. Produser menunggu konsumer mengkonsumsi barang dan konsumer menunggu produser menaruh barang. Hal ini terjadi karena adanya komunikasi yang macet antara produser dan konsumer. Produser setelah menaruh barang tidak menginformasikan ke konsumer bahwa ada barang yang sudah dimasukan. konsumer terus menunggu tanpa tahu bahwa barang sudah dimasukan.
Hal yang sebaliknya bisa terjadi; produser menunggu sampai bounded buffer ada yang kosong ,padahal konsumer telah mengkonsumsi yang otomatis ada ruang kosong dalam bounded buffer hanya saja produser tidak diberitahu. Sehingga pada saat bounded buffer kosong produser tetap saja menunggu.
Deadlock yang sederhana pada contoh diatas bisa diatasi jika komunikasi bisa dilakukan oleh produser dan konsumer. Pada contoh program ada kode program notifyAll() pada bagian produser dan konsumer. Kode ini berfungsi untuk memberitahu kepada semua proses yang menunggu bahwa suatu proses telah melakukan sesuatu. sehingga proses yang lain akan melihat apakah mereka masih harus menunggu atau melakuan aksi mereka lagi. Jika produser setelah menaruh ke bounded buffer dia akan memberitahukan ke konsumer sebaliknya konsumer akan memberitahukan ke produser bahwa dia melakukan konsumsi.