Вниз  Java-программирование (1-ые посты)
- 26.06.2014 / 18:52
Zvers
  Пользователь

Zvers 
Сейчас: Offline
Ксакеп, Вот с помощью Unsafe (сорри за самописный стек, думаю, реализация заинтересует)


import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.misc.Unsafe;

/*
  * To change this license header, choose License Headers in Project Properties.
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
/**
  *
  * @author Qbold
  */
public class AOS {

     public static long[] st;
     public static long next_;
     public static String str_;
     public static Unsafe unsafe;

     public static void main(String[] args) {
         try {
           Field f = Unsafe.class.getDeclaredField("theUnsafe");
           f.setAccessible(true);
           unsafe = (Unsafe) f.get(null);
           st = new long[]{-1, -1, -1, -1};
           push("ABCD", 1);
           push("ABCDA", 1);
           push("abgf", 0);
           push("4555fgff", 2);
           push("4555fgf11111111f", 2);
           push("4MMMMMM", 2);
           System.out.println(pop(1));
           push("ABCDB", 1);
           System.out.println(pop(1));
           System.out.println(pop(1));
           System.out.println(pop(1));
           System.out.println(pop(0));
           System.out.println(pop(2));
           System.out.println(pop(2));
           System.out.println(pop(2));
         } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException ex) {
           Logger.getLogger(AOS.class.getName()).log(Level.SEVERE, null, ex);
         }
     }

     public static void push(String s, int pos) {
         try {
           byte[] b = s.getBytes("UTF-8");
           ByteBuffer buf = ByteBuffer.allocateDirect(b.length + 10);
           buf.position(0);
           buf.putShort((short) b.length);
           buf.put(b);
           buf.putLong(st[pos]);
           st[pos] = getAddress(buf);
         } catch (UnsupportedEncodingException ex) {
           Logger.getLogger(AOS.class.getName()).log(Level.SEVERE, null, ex);
         }
     }

     public static String pop(int pos) {
         long obj = st[pos];
         if (obj + 1 == 0) {
           return "null";
         }
         ByteBuffer obj2 = getObjectFromAddress(obj);
         obj2.position(0);
         getData(obj2);
         obj2.flip();
         st[pos] = next_;
         obj2.flip();
         return str_;
     }

     public static void getData(ByteBuffer bf) {
         try {
           byte[] d = new byte[bf.getShort()];
           for (int i = 0; i < d.length; i++) {
           d[i] = bf.get();
           }
           str_ = new String(d, "UTF-8");
           next_ = bf.getLong();
         } catch (UnsupportedEncodingException ex) {
           Logger.getLogger(AOS.class.getName()).log(Level.SEVERE, null, ex);
         }
     }

     public static ByteBuffer getObjectFromAddress(long ad) {
         if (ad + 1 == 0) {
           return null;
         }
         short size = unsafe.getShort(ad);
         byte[] data = new byte[size + 10];
         for (int i = 0; i < data.length; i++) {
           data[i] = unsafe.getByte(ad + i);
         }
         return ((ByteBuffer) ByteBuffer.allocate(data.length).position(0)).put(data);
     }

     public static long getAddress(ByteBuffer o) {
         try {
           Field f = Buffer.class.getDeclaredField("address");
           f.setAccessible(true);
           return f.getLong(o);
         } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
           Logger.getLogger(AOS.class.getName()).log(Level.SEVERE, null, ex);
         }
         return -1;
     }
}
- 26.06.2014 / 19:00
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Сделайте меня развидеть это
__________________
 let live
- 26.06.2014 / 19:07
Zvers
  Пользователь

Zvers 
Сейчас: Offline
aNNiMON, просто хотел показать, как можно работать с Unsafe'ом. При написании системных программ он порой бывает незаменим.
- 26.06.2014 / 19:21
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
Zvers, отлично, только кидай в теги [code java][/code], пожалуйста оО"
Но вообще-то aNNiMON прав, это кошмар.
- 26.06.2014 / 19:36
Zvers
  Пользователь

Zvers 
Сейчас: Offline
Ксакеп, Соглашусь с тем, что лучше рефлексию обходить стороной, но Unsafe - это мощнейший инструмент для работы с данными. Его можно использовать при создании, например, серверных системных приложений для оптимизации хранения данных. Яркий пример того - выделение буферов за пределами хипа и, соответственно, "ручная" их обработка. Unsafe же предоставит свободу действий для манипулирования информацией, может пригодиться при создании сложных оптимизирующих структур.

Изменено Zvers (26.06 / 19:38) (всего 1 раз)
- 26.06.2014 / 20:37
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Zvers, да, вот за это спасибо. Нашел статьи по теме, для общего развития пойдёт.
__________________
 let live
- 28.06.2014 / 19:57
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
Пост #350483. Все те реализации, что были выше, это хорошо, но мне хотелось вот так:
  1. Stack<String>[] array = (Stack<String>[]) new Stack[N];

- 28.06.2014 / 21:00
Zvers
  Пользователь

Zvers 
Сейчас: Offline
Ксакеп,
  1. import java.util.Stack;
  2.  
  3. public class Deadlock {
  4.  
  5.     public static Stack<String>[] array = (Stack<String>[]) new Stack[5];
  6.  
  7.     static {
  8.         for (int i = 0; i < array.length; i++) {
  9.             array[i] = new Stack<>();
  10.         }
  11.     }
  12.  
  13.     public static void main(String[] arg) {
  14.         push("ABCD", 1);
  15.         push("ABCDA", 1);
  16.         push("abgf", 0);
  17.         push("4555fgff", 2);
  18.         push("4555fgf11111111f", 2);
  19.         push("4MMMMMM", 2);
  20.         System.out.println(pop(1));
  21.         push("ABCDB", 1);
  22.         System.out.println(pop(1));
  23.         System.out.println(pop(1));
  24.         System.out.println(pop(1));
  25.         System.out.println(pop(0));
  26.         System.out.println(pop(2));
  27.         System.out.println(pop(2));
  28.         System.out.println(pop(2));
  29.     }
  30.  
  31.     public static void push(String a, int p) {
  32.         array[p].push(a);
  33.     }
  34.  
  35.     public static String pop(int p) {
  36.         if (array[p].empty()) {
  37.             return "null";
  38.         }
  39.         return array[p].pop();
  40.     }
  41. }

- 28.06.2014 / 22:42
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
(Это вопрос) Мне хочется возбудить ConcurrentModificationException в итераторе самописного дека (deque), но я никогда этим не занимался и не знаю, на чём основывается это дело. То есть должен быть некоторый инвариант состояния дека? Например, длина + последний занесённый объект. То есть, что делать-то мне?
- 28.06.2014 / 22:47
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
__________________
 знает толк

Изменено vl@volk (28.06 / 22:50) (всего 1 раз)
Наверх  Всего сообщений: 16875
Фильтровать сообщения
Поиск по теме
Файлы топика (794)