diff --git a/src/main/java/jvm/VolatileTest.java b/src/main/java/jvm/VolatileTest.java new file mode 100644 index 0000000..c9c4832 --- /dev/null +++ b/src/main/java/jvm/VolatileTest.java @@ -0,0 +1,42 @@ +package jvm; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; + +public class VolatileTest { + + public static volatile int race = 0; + private static final Object lock = new Object(); + private static final ReentrantLock lock1 = new ReentrantLock(); + public static AtomicInteger race1 = new AtomicInteger(0); + + public static void increase() { +// synchronized (lock) { +// race++; +// } + race1.getAndAdd(1); + lock1.lock(); + race++; + lock1.unlock(); + } + + private static final int THREADS_COUNT = 20; + + static void main() { + Thread[] threads = new Thread[THREADS_COUNT]; + for (int i = 0; i < THREADS_COUNT; i++) { + threads[i] = new Thread(() -> { + for (int j = 0; j < 1000; j++) { + increase(); + } + }); + threads[i].start(); + } + // for idea only. otherwise should be 1 + while (Thread.activeCount() > 2) { + Thread.yield(); + } + System.out.println(race); + System.out.println(race1.get()); + } +} diff --git a/src/main/java/loader/CustomLoader.java b/src/main/java/loader/CustomLoader.java new file mode 100644 index 0000000..c3461b1 --- /dev/null +++ b/src/main/java/loader/CustomLoader.java @@ -0,0 +1,56 @@ + +package loader; + +import java.io.*; + +public class CustomLoader extends ClassLoader{ + + private String classPath; + + public CustomLoader(String classPath) { + this.classPath = classPath; + } + + private byte[] loadClassBytes(String className) { + String path = STR."\{classPath}\{File.separatorChar}\{className.replace('.', File.separatorChar)}.class".trim(); +// File file = new File("C:\\Users\\wjluk\\projects\\java_multithread\\src\\main\\java\\loader\\LoaderTest.class"); + File file = new File(path); + System.out.println(file.exists()); + try (InputStream is = new FileInputStream(path); + ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = is.read(buffer)) != -1) { + baos.write(buffer, 0, bytesRead); + } + return baos.toByteArray(); + } catch (IOException e) { + return null; + } + } + + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + byte[] classBytes = loadClassBytes(name); + if (classBytes == null) { + throw new ClassNotFoundException(); + } + return defineClass(name, classBytes, 0, classBytes.length); + } + + static void main(String[] args) throws Exception { + CustomLoader loader = new CustomLoader(" D:\\"); + Class clazz = loader.loadClass("LoaderTest"); + Object obj = clazz.newInstance(); + clazz.getMethod("greeting").invoke(obj); + System.out.println(clazz.getClassLoader()); + + System.out.println("---------------------for parent loader-------------------"); + ClassLoader classLoader = loader.getClass().getClassLoader(); + while (classLoader != null) { + System.out.println( "\t" + classLoader); + classLoader = classLoader.getParent(); + } + } +}