diff --git a/.gitignore b/.gitignore index 49a37d0..1de5659 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -MultiThread_demo/bin -MultiThread_demo/.settings \ No newline at end of file +target \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore index 0e40fe8..5c98b42 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,3 +1,2 @@ - # Default ignored files /workspace.xml \ No newline at end of file diff --git a/.idea/MultiThreadPro.iml b/.idea/MultiThreadPro.iml new file mode 100644 index 0000000..85b1662 --- /dev/null +++ b/.idea/MultiThreadPro.iml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..511b0c0 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/xycode.xml b/.idea/dictionaries/xycode.xml new file mode 100644 index 0000000..f98e000 --- /dev/null +++ b/.idea/dictionaries/xycode.xml @@ -0,0 +1,9 @@ + + + + nanos + reentrant + xycode + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 6e8e052..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6560a98 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_beust_jcommander_1_72.xml b/.idea/libraries/Maven__com_beust_jcommander_1_72.xml new file mode 100644 index 0000000..ad12dd9 --- /dev/null +++ b/.idea/libraries/Maven__com_beust_jcommander_1_72.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml new file mode 100644 index 0000000..d411041 --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.xml b/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.xml new file mode 100644 index 0000000..3b84834 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..f58bbc1 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_openjdk_jol_jol_core_0_9.xml b/.idea/libraries/Maven__org_openjdk_jol_jol_core_0_9.xml new file mode 100644 index 0000000..366b137 --- /dev/null +++ b/.idea/libraries/Maven__org_openjdk_jol_jol_core_0_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_testng_testng_6_14_3.xml b/.idea/libraries/Maven__org_testng_testng_6_14_3.xml new file mode 100644 index 0000000..3e0d80c --- /dev/null +++ b/.idea/libraries/Maven__org_testng_testng_6_14_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/annotations_17_0_0.xml b/.idea/libraries/annotations_17_0_0.xml deleted file mode 100644 index 1e44f17..0000000 --- a/.idea/libraries/annotations_17_0_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/disruptor_3_4_2.xml b/.idea/libraries/disruptor_3_4_2.xml deleted file mode 100644 index a4add2a..0000000 --- a/.idea/libraries/disruptor_3_4_2.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 79223a5..71e13c4 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,9 +1,13 @@ - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index a231978..db2f06c 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/Java-MultiThread-Study.iml b/MultiThreadDP.iml similarity index 51% rename from .idea/Java-MultiThread-Study.iml rename to MultiThreadDP.iml index 2900e7a..c90834f 100644 --- a/.idea/Java-MultiThread-Study.iml +++ b/MultiThreadDP.iml @@ -3,12 +3,9 @@ - - + - - \ No newline at end of file diff --git a/MultiThread_demo/.classpath b/MultiThread_demo/.classpath deleted file mode 100644 index 5143540..0000000 --- a/MultiThread_demo/.classpath +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/MultiThread_demo/.project b/MultiThread_demo/.project deleted file mode 100644 index 40385c7..0000000 --- a/MultiThread_demo/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - MultiThread_demo - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/MultiThread_demo/Alice-log.txt b/MultiThread_demo/Alice-log.txt deleted file mode 100644 index 168bd93..0000000 --- a/MultiThread_demo/Alice-log.txt +++ /dev/null @@ -1,11 +0,0 @@ -i = 0 -i = 1 -i = 2 -i = 3 -i = 4 -i = 5 -i = 6 -i = 7 -i = 8 -i = 9 -==== end of log ==== diff --git a/MultiThread_demo/Bob-log.txt b/MultiThread_demo/Bob-log.txt deleted file mode 100644 index 168bd93..0000000 --- a/MultiThread_demo/Bob-log.txt +++ /dev/null @@ -1,11 +0,0 @@ -i = 0 -i = 1 -i = 2 -i = 3 -i = 4 -i = 5 -i = 6 -i = 7 -i = 8 -i = 9 -==== end of log ==== diff --git a/MultiThread_demo/Charis-log.txt b/MultiThread_demo/Charis-log.txt deleted file mode 100644 index 168bd93..0000000 --- a/MultiThread_demo/Charis-log.txt +++ /dev/null @@ -1,11 +0,0 @@ -i = 0 -i = 1 -i = 2 -i = 3 -i = 4 -i = 5 -i = 6 -i = 7 -i = 8 -i = 9 -==== end of log ==== diff --git a/MultiThread_demo/lib/annotations-17.0.0.jar b/MultiThread_demo/lib/annotations-17.0.0.jar deleted file mode 100644 index 477f7d0..0000000 Binary files a/MultiThread_demo/lib/annotations-17.0.0.jar and /dev/null differ diff --git a/MultiThread_demo/lib/disruptor-3.4.2.jar b/MultiThread_demo/lib/disruptor-3.4.2.jar deleted file mode 100644 index b366bbe..0000000 Binary files a/MultiThread_demo/lib/disruptor-3.4.2.jar and /dev/null differ diff --git a/MultiThread_demo/lib/jmatrices0.6.jar b/MultiThread_demo/lib/jmatrices0.6.jar deleted file mode 100644 index 8d79555..0000000 Binary files a/MultiThread_demo/lib/jmatrices0.6.jar and /dev/null differ diff --git a/MultiThread_demo/src/com/xycode/DH/Constant.java b/MultiThread_demo/src/com/xycode/DH/Constant.java deleted file mode 100644 index 276b5c3..0000000 --- a/MultiThread_demo/src/com/xycode/DH/Constant.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xycode.DH; - -import java.util.Random; - -public class Constant { - public final static int a=5; - public final static int p=23; - public static Random r=new Random(); - public static int get(int private_key) {//获得密钥计算过程中的中间结果 - return ((int)Math.pow(a,private_key))%p; - } - - public static int get(int f, int s) {//生成最终的密钥 - return ((int)Math.pow(f,s))%p; - } -} diff --git a/MultiThread_demo/src/com/xycode/DH/DHClient.java b/MultiThread_demo/src/com/xycode/DH/DHClient.java deleted file mode 100644 index 160418d..0000000 --- a/MultiThread_demo/src/com/xycode/DH/DHClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.xycode.DH; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - - -public class DHClient implements Runnable{ - private static ExecutorService es=Executors.newCachedThreadPool(); - private int private_key; - private int server_DH_KEY;//中间结果 - private int final_DH_KEY;//最终的密钥 - - public DHClient(int private_key) { - this.private_key = private_key; - } - - @Override - public void run() { - Socket client=null; - PrintWriter writer=null; - BufferedReader reader=null; - try { - client=new Socket(); - //client.bind(new InetSocketAddress("localhost",12345));//静态绑定,固定端口 - client.connect(new InetSocketAddress("localhost",8888)); - //连接到Server监听的ip与port,client所用的port是随机分配的,除非之前bind(port) - writer=new PrintWriter(client.getOutputStream(),true); - writer.println("Client_DH_KEY : "+Constant.get(private_key)); - reader=new BufferedReader(new InputStreamReader(client.getInputStream())); - String inputLine=null; - while((inputLine=reader.readLine())!=null) { - String[] s=inputLine.split(" : "); - if(s[0].equals(new String("Server_DH_KEY"))) { - server_DH_KEY=Integer.parseInt(s[1]); - final_DH_KEY=Constant.get(Constant.get(private_key),server_DH_KEY); - } - break; - } - int info=Constant.r.nextInt(1000); - writer.println("Client_INFO : "+(info^final_DH_KEY)); - System.out.println("Client send : "+info); - }catch (Exception e) { - e.printStackTrace(); - }finally { - try { - if(writer!=null) writer.close(); - if(reader!=null) reader.close(); - if(client!=null) client.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - public static void main(String[] args) throws InterruptedException { - for(int i=0;i<10;++i) {//10个ClientSocket连接 - Thread.sleep(500); - es.execute(new DHClient(Constant.r.nextInt(1000))); - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/DH/DHServer.java b/MultiThread_demo/src/com/xycode/DH/DHServer.java deleted file mode 100644 index f7db55d..0000000 --- a/MultiThread_demo/src/com/xycode/DH/DHServer.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.xycode.DH; -/* 非对称密钥交换 - * Diffie-Hellman算法 - * 将其应用在Socket编程中,安全地生成密钥后,应用简单的异或加密来验证一下 - * - */ -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - - -public class DHServer { - private static ExecutorService es=Executors.newCachedThreadPool(); - //ServerSocket可能会管理多个Client连接,故采用Map存储密钥信息 - private static Map client_DH_KEY=new HashMap<>();//中间结果 - private static Map final_DH_KEY=new HashMap<>();//最终的密钥 - private static int private_key; - static class handle_msg implements Runnable{ - Socket client_socket; - public handle_msg(Socket client_socket) { - this.client_socket = client_socket; - } - - @Override - public void run() { - BufferedReader is=null; - PrintWriter os=null; - try { - is=new BufferedReader(new InputStreamReader(client_socket.getInputStream())); - os=new PrintWriter(client_socket.getOutputStream(),true);//autoFlush=true - String inputLine=null; - while((inputLine=is.readLine())!=null) { - String[] s=inputLine.split(" : "); - if(s[0].equals(new String("Client_DH_KEY"))) { - client_DH_KEY.put(client_socket, Integer.parseInt(s[1])); - final_DH_KEY.put(client_socket,Constant.get(Constant.get(private_key),Integer.parseInt(s[1]))); - os.println("Server_DH_KEY : "+Constant.get(private_key)); - }else if(s[0].equals(new String("Client_INFO"))){ - int info=Integer.parseInt(s[1])^final_DH_KEY.get(client_socket); - System.out.println("DHServer recv : "+info); - }else { - System.out.println("Format Error!"); - break; - } - } - }catch (Exception e) { - e.printStackTrace(); - }finally { - try{ - if(is!=null) is.close(); - if(os!=null) os.close(); - if(client_socket!=null) client_socket.close(); - }catch (Exception e) { - e.printStackTrace(); - } - } - } - - - } - - public static void main(String[] args) { - ServerSocket echoServer=null; - Socket clientSocket=null; - try { - echoServer=new ServerSocket(8888); - }catch (Exception e) { - e.printStackTrace(); - } - private_key=123; - while(true) { - try { - clientSocket=echoServer.accept();//监听echoServer的8888端口 - System.out.println(clientSocket.getRemoteSocketAddress()+" connected."); - es.execute(new handle_msg(clientSocket)); - }catch (Exception e) { - e.printStackTrace(); - } - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/Executor/Executor_demo_1.java b/MultiThread_demo/src/com/xycode/Executor/Executor_demo_1.java deleted file mode 100644 index 49f4355..0000000 --- a/MultiThread_demo/src/com/xycode/Executor/Executor_demo_1.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.xycode.Executor; -/** - * 实现任务的创建(调用)与任务的执行分离 - * @author xycode - * - */ -public class Executor_demo_1 { - - public static void main(String[] args) { - MyChannel channel=new MyChannel(10); - channel.start(); - new MyClient("Alice",channel).start(); - new MyClient("Bob",channel).start(); - new MyClient("Charis",channel).start(); - - } - -} diff --git a/MultiThread_demo/src/com/xycode/Executor/MyChannel.java b/MultiThread_demo/src/com/xycode/Executor/MyChannel.java deleted file mode 100644 index 0881762..0000000 --- a/MultiThread_demo/src/com/xycode/Executor/MyChannel.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.xycode.Executor; - -import java.util.concurrent.LinkedBlockingQueue; - -public class MyChannel { - private static final int MAX_REQUEST=100; - private final LinkedBlockingQueue requestQueue; - - private final MyWorker[] workerPool; - - public MyChannel(int workerNum) { - this.requestQueue=new LinkedBlockingQueue<>(MAX_REQUEST); - this.workerPool=new MyWorker[workerNum]; - - for(int i=0;i requestQueue; - - ExecutorService workerPool; - - public MyChannel() { - this.requestQueue=new LinkedBlockingQueue<>(MAX_REQUEST); - this.workerPool=Executors.newCachedThreadPool(); - } - - public void start(int workerNum) { - for(int i=0;i0.5) - request=new MyRequest(super.getName(),++cnt); - else - request=new MyRequest2(super.getName(), ++cnt); - channel.putRequest(request); - try { - Thread.sleep(450); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest.java b/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest.java deleted file mode 100644 index 81c58a0..0000000 --- a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.xycode.Executor.pro; - -public class MyRequest implements Request{ - private String name; - private int id; - public MyRequest(String name, int id) { - super(); - this.name = name; - this.id = id; - } - - - @Override - public void task() { - System.out.println(Thread.currentThread().getName()+" executes "+this); - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - @Override - public String toString() { - return "{ Request from "+name+ ", TaskId="+id+"}"; - } - -} diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest2.java b/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest2.java deleted file mode 100644 index e65edda..0000000 --- a/MultiThread_demo/src/com/xycode/Executor/pro/MyRequest2.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.xycode.Executor.pro; - -public class MyRequest2 implements Request{ - private String name; - private int id; - public MyRequest2(String name, int id) { - super(); - this.name = name; - this.id = id; - } - - - @Override - public void task() { - System.out.println(Thread.currentThread().getName()+" executes "+this); - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - @Override - public String toString() { - return "{ Request from "+name+ ", Task2Id="+id+"}"; - } - -} diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/MyWorker.java b/MultiThread_demo/src/com/xycode/Executor/pro/MyWorker.java deleted file mode 100644 index 7a82e86..0000000 --- a/MultiThread_demo/src/com/xycode/Executor/pro/MyWorker.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.xycode.Executor.pro; - -public class MyWorker extends Thread{ - private final MyChannel channel; - public MyWorker(String name,MyChannel channel) { - super(name); - this.channel = channel; - } - - public void cancel() { - this.interrupt(); - } - - @Override - public void run() { - while(true) { - if(Thread.currentThread().isInterrupted()) {//中断式的停止,最为安全 - System.out.println(Thread.currentThread().getName()+" interrupted, exit!"); - break; - } - Request request=channel.takeRequest(); - request.task(); - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/Executor/pro/Request.java b/MultiThread_demo/src/com/xycode/Executor/pro/Request.java deleted file mode 100644 index 62749d0..0000000 --- a/MultiThread_demo/src/com/xycode/Executor/pro/Request.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.xycode.Executor.pro; - -public interface Request { - public void task(); -} diff --git a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo.java b/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo.java deleted file mode 100644 index 9524189..0000000 --- a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.xycode.LockWork; -/** - * AtomicData类,底层原理是CAS,在竞争不是太激烈的情况下,性能优于加锁的方式 - * 更高级的还有AtomicReference,针对一般的类进行封装,不过要手动的进行CAS操作,CompareAndSet - */ -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.ReentrantLock; - - -public class AtomicDemo implements Runnable{ - static AtomicInteger i=new AtomicInteger(0);//原子Integer类,初值赋为0,底层原理是CAS - static int k=0; - int mode; - public static ReentrantLock lock=new ReentrantLock(false); - - public AtomicDemo(int mode) { - super(); - this.mode = mode; - } - - @Override - public void run() { - if(mode==0) { - //1900 - for(int j=0;j<10000000;++j) { - i.incrementAndGet();//相当于++i,AtomicInteger不支持形如++i,i++的操作,必须通过api - } - }else { - //10ms - lock.lock(); - for(int j=0;j<10000000;++j) { - ++k; - - } - lock.unlock(); - - //2000ms - //AtomicInteger的方法性能比下面这个稍好一些,远不如上面那种更优的加锁方式(锁粗化) -// for(int j=0;j<10000000;++j) { -// lock.lock(); -// ++k; -// lock.unlock(); -// } - } - - } - - public static void main(String[] args) { -// long b=System.currentTimeMillis(); -// ExecutorService es=new ThreadPoolExecutor(10,10,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) { -// @Override -// protected void beforeExecute(Thread t, Runnable r) { -// super.beforeExecute(t, r);//默认是空的方法 -// -// } -// @Override -// protected void afterExecute(Runnable r, Throwable t) { -// super.afterExecute(r, t); -// -// } -// @Override -// protected void terminated() { -// super.terminated();//默认是空的方法 -// System.out.println(i); -// System.out.println("ThreadPool exit!"); -// System.out.println("AtomicInteger total cost time: "+(System.currentTimeMillis()-b)+"ms."); -// } -// }; -// -// for(int i=0;i<10;++i) { -// es.submit(new AtomicDemo(0)); -// } -// es.shutdown(); - - - long b=System.currentTimeMillis(); - ExecutorService es=new ThreadPoolExecutor(10,10,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) { - @Override - protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r);//默认是空的方法 - - } - @Override - protected void afterExecute(Runnable r, Throwable t) { - super.afterExecute(r, t); - - } - @Override - protected void terminated() { - super.terminated();//默认是空的方法 - System.out.println(k); - System.out.println("ThreadPool exit!"); - System.out.println("ReentrantLock total cost time: "+(System.currentTimeMillis()-b)+"ms."); - } - }; - - for(int i=0;i<10;++i) { - es.submit(new AtomicDemo(1)); - } - es.shutdown(); - - - } -} diff --git a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo2.java b/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo2.java deleted file mode 100644 index b72404a..0000000 --- a/MultiThread_demo/src/com/xycode/LockWork/AtomicDemo2.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.xycode.LockWork; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; - -/* - * 直接对普通对象进行Atomic封装 - * AtomicIntegerFieldUpdate - * AtomicLongFieldUpdate - * AtomicReferenctFieldUpdate - */ -public class AtomicDemo2 { - static class Candidate{ - int id; - volatile int score; - public Candidate(int id, int score) { - super(); - this.id = id; - this.score = score; - } - - } - - static final AtomicIntegerFieldUpdater scoreUpdater - =AtomicIntegerFieldUpdater.newUpdater(Candidate.class, "score");//反射机制Candidate.score - static AtomicInteger total_score=new AtomicInteger(0); - - public static void main(String[] args) throws InterruptedException { - final Candidate stu=new Candidate(1,0); - Thread[] t=new Thread[10000]; - for(int i=0;i<10000;++i) { - t[i]=new Thread() { - public void run() { - if(Math.random()>0.4) { - scoreUpdater.incrementAndGet(stu); - total_score.incrementAndGet(); - } - } - }; - t[i].start();//调用start方法但是调用该方法只是准备线程并不是马上启动 - } - for(int i=0;i<10000;++i) t[i].join(); - System.out.println("score = "+stu.score); - System.out.println("total score = "+total_score); - - } - -} diff --git a/MultiThread_demo/src/com/xycode/LockWork/ThreadLocalDemo.java b/MultiThread_demo/src/com/xycode/LockWork/ThreadLocalDemo.java deleted file mode 100644 index d516447..0000000 --- a/MultiThread_demo/src/com/xycode/LockWork/ThreadLocalDemo.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.xycode.LockWork; -/** - * ThreadLocal,一种通过给每个线程生成局部数据来避免全局数据资源竞争的方法. - * 实践证明,传统的直接在累内声明局部的数据成员也能达到相同的效果,性能也基本一致. - * 所以说,ThreadLocal相比传统的方法更多的是起到了将数据解耦的作用. - * - */ -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -public class ThreadLocalDemo{ - static final int GEN_COUNT=10000000; - static final int THREAD_COUNT=4; - static ExecutorService es=Executors.newFixedThreadPool(THREAD_COUNT); - static Random r=new Random(1234); - - static ThreadLocal tr=new ThreadLocal() {//ThreadLocal model,为每个线程生成一个本地数据,避免锁竞争 - protected Random initialValue() { - return new Random(1234); - } - }; - - static class MyTask implements Callable{ - int mode; - Random my_r; - public MyTask(int mode) { - super(); - this.mode = mode; - this.my_r=new Random(1234); - } - - @Override - public Long call(){ - long b=System.currentTimeMillis(); - for(int i=0;i[] f=new Future[THREAD_COUNT];//future model - for(int i=0;i re=null; - - public AskThread(CompletableFuture re) { - super(); - this.re = re; - } - - @Override - public void run() { - int result=0; - try { - result=re.get()*re.get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - System.out.println(result); - } - } - - public static int calc(int para) { - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return para*para; - } - - public static int div(int a,int b) { - return a/b; - } - - public static void f() { - ; - } - - public static void main(String[] args) throws InterruptedException, ExecutionException { -// /* -// * 1.构造一个CompletableFuture实例 -// * 2.新建一个线程,将CompletableFuture实例作为参数,然后执行(run()里面需要Future.get()) -// */ -// final CompletableFuture fu=new CompletableFuture<>(); -// new Thread(new AskThread(fu)).start(); -// System.out.println("sleep..."); -// Thread.sleep(2000); -// fu.complete(100);//填充数据(对应get()) -//// fu.complete(200); - - -// //更简便的写法 -// final CompletableFuture fu=CompletableFuture.supplyAsync(()->calc(100)); -// /* -// * CompletableFuture supplyAsync(Supplier supplier) -// * Supplier是一个函数接口 -// * -// * @FunctionalInterface -// public interface Supplier { -// T get(); -// } -// Functional Interface: 这是一个功能界面,可以用作lambda表达式或方法引用的赋值对象。 -// */ -// System.out.println("calculating..."); -// System.out.println(fu.get()); - - - //CompletableFuture的异常处理,流式调用 - CompletableFuture fu=CompletableFuture//虽然div有返回值,但是经过一系列的流式调用后,就没有返回值了 - .supplyAsync(()->div(12,0)) - .exceptionally(exception->{ - exception.printStackTrace(); - return 0; - }) - .thenApply(i->Integer.toString(i)) - .thenApply(str->("\""+str+"\"")) - .thenAccept(System.out::println); - System.out.println(fu.get());//fu.get()返回null,实际上返回值为void(或者叫无返回值)是不能打印的 - - } - -} diff --git a/MultiThread_demo/src/com/xycode/ParallelJava8/FunctionalProgarmmingDemo1.java b/MultiThread_demo/src/com/xycode/ParallelJava8/FunctionalProgarmmingDemo1.java deleted file mode 100644 index d38de6f..0000000 --- a/MultiThread_demo/src/com/xycode/ParallelJava8/FunctionalProgarmmingDemo1.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.xycode.ParallelJava8; - -import java.util.Arrays; - -public class FunctionalProgarmmingDemo1 { - - public static void main(String[] args) { - int[] arr= {1,2,3,4,5}; - Arrays.stream(arr).map(x->x+1).forEach(System.out::print); - System.out.println(); - Arrays.stream(arr).forEach(System.out::print);//函数式编程几乎不会改变所传递的对象,这天然适合并行化 - } - -} diff --git a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAccumulatorDemo.java b/MultiThread_demo/src/com/xycode/ParallelJava8/LongAccumulatorDemo.java deleted file mode 100644 index 55da4c8..0000000 --- a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAccumulatorDemo.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.xycode.ParallelJava8; - -import java.util.Random; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.LongAccumulator; - -public class LongAccumulatorDemo { - - public static void main(String[] args) { - LongAccumulator accumulator=new LongAccumulator(Long::max, Long.MIN_VALUE);//指定操作的函数和初始值 - ExecutorService es=Executors.newCachedThreadPool(); - for(int i=0;i<10000;++i) { - es.submit(new Thread( - ()->{ - Random r=new Random(); - accumulator.accumulate(r.nextLong()); - } - )); - } - es.shutdown(); - System.out.println(accumulator.get()); - - } - -} diff --git a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAdderDemo.java b/MultiThread_demo/src/com/xycode/ParallelJava8/LongAdderDemo.java deleted file mode 100644 index cb31b1e..0000000 --- a/MultiThread_demo/src/com/xycode/ParallelJava8/LongAdderDemo.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.xycode.ParallelJava8; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.LongAdder; -import java.util.concurrent.locks.ReentrantLock; - -public class LongAdderDemo { - static final int MAX_THREAD=10; - static final int TASK_COUNT=10; - static final int TARGET_COUNT=10000000; - ReentrantLock lock=new ReentrantLock(); - long count=0;//普通的加锁同步 - AtomicLong acount=new AtomicLong(0);//原子同步 - LongAdder lacount=new LongAdder();//LongAdder同步(原理:基于原子同步的热点分离) - - - static CountDownLatch cdlsync=new CountDownLatch(TASK_COUNT);//等待指定的线程完成(倒计数器) - static CountDownLatch cdlatomic=new CountDownLatch(TASK_COUNT); - static CountDownLatch cdladder=new CountDownLatch(TASK_COUNT); - - static class SyncThread implements Runnable{ - String name; - long start; - LongAdderDemo out; - - public SyncThread(String name, long start, LongAdderDemo out) { - super(); - this.name = name; - this.start = start; - this.out = out; - } - - @Override - public void run() { - - for(int i=0;i{ - - static final int THRESHOLD=10000; - long start,end; - - public ForkAndJoin(long start, long end) { - super(); - this.start = start; - this.end = end; - } - - @Override - protected Long compute() { - long sum=0; - if(end-start subTasks=new ArrayList<>(); - long pos=start; - for(int i=0;i<100;++i) {//分割成100个子任务 - long lastOne=pos+start; - if(lastOne>end) lastOne=end; - ForkAndJoin subtask=new ForkAndJoin(pos, lastOne); - pos+=step+1; - subTasks.add(subtask); - subtask.fork(); - } - for(ForkAndJoin t:subTasks) { - sum+=t.join();//Returns:the computed result - } - } - return sum; - } - - public static void main(String[] args) { - ForkJoinPool pool=new ForkJoinPool(); - ForkAndJoin task=new ForkAndJoin(0, 200000); - ForkJoinTask result=pool.submit(task);//future模式 - try { - System.out.println("sum = "+result.get()); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReadWriteLock.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReadWriteLock.java deleted file mode 100644 index 3faea0f..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ReadWriteLock.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.xycode.ThreadWork; -import java.util.Random; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -/* - * 1.ReentrantReadWriteLock(读写(重入)锁)能使读操作与读操作之间并行,因为读操作与读操作之间没有数据一致性的问题, - * 读操作与写操作,写操作与写操作之间能必须同步,此时读写锁就相当于普通的锁, - * 2.在读操作的次数远大于写操作是,读写锁能带来极大的性能提升. - * 3.实践证明,join()会使这玩意失灵.... - */ -public class ReadWriteLock { - static Lock lock=new ReentrantLock(); - static ReentrantReadWriteLock readWriteLock=new ReentrantReadWriteLock(); - static Lock readLock=readWriteLock.readLock(); - static Lock writeLock=readWriteLock.writeLock(); - int val; - public Object handleRead(Lock lock) { - try { - lock.lock(); - Thread.sleep(1000);//模拟一个耗时的读操作 - System.out.println(val); - } catch (InterruptedException e) { - e.printStackTrace(); - }finally { - lock.unlock(); - } - return val; - } - - public void handleWrite(Lock lock,int data) { - - try { - lock.lock(); - Thread.sleep(1000);//模拟一个耗时的写操作 - val=data; - } catch (InterruptedException e) { - e.printStackTrace(); - }finally { - lock.unlock(); - } - - } - - public static void main(String[] args) throws InterruptedException { - final ReadWriteLock demo=new ReadWriteLock(); - Runnable readRunnable=new Runnable() { - @Override - public void run() { - demo.handleRead(readLock); -// demo.handleRead(lock); - } - }; - Runnable writeRunnable=new Runnable() { - @Override - public void run() { - demo.handleWrite(writeLock,new Random().nextInt(100)); -// demo.handleRead(lock,new Random().nextInt(100)); - } - }; -// long begin=System.currentTimeMillis(); -// for(int i=0;i<10;++i) { -// if(i<8) { -// Thread t=new Thread(readRunnable); -// t.start(); -// t.join();//main线程要等待t线程执行结束 -// } -// else { -// Thread t=new Thread(writeRunnable); -// t.start(); -// t.join(); -// } -// } -// System.out.println("consume time: "+(System.currentTimeMillis()-begin)/1000+"s"); - - for(int i=0;i<2;++i) { - Thread t=new Thread(writeRunnable); - t.start(); - } - - for(int i=0;i<18;++i) { - Thread t=new Thread(readRunnable); - t.start(); - } - - - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockAndCondition.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockAndCondition.java deleted file mode 100644 index d4d6bd6..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockAndCondition.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.xycode.ThreadWork; -/* - * Condition[await(),signal()]一般和ReentrantLock[lock(),unlock()]搭配使用 - * await(),signal()的作用类似于wait(),notify() - */ -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - -public class ReentrantLockAndCondition implements Runnable{ - static ReentrantLock lock=new ReentrantLock(); - static Condition condition=lock.newCondition(); - - @Override - public void run() { - - try { - lock.lock(); - System.out.println("Thread-"+Thread.currentThread().getId()+" is waitting..."); - condition.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - }finally { - lock.unlock(); - System.out.println("Thread-"+Thread.currentThread().getId()+" exit!"); - } - } - - public static void main(String[] args) throws InterruptedException { - Thread t1=new Thread(new ReentrantLockAndCondition()); - t1.start(); - t1.sleep(2000); - - lock.lock(); - condition.signal();//必须持有锁(与condition关联的lock)才可以signal - lock.unlock(); - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo1.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo1.java deleted file mode 100644 index 241feb7..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo1.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.xycode.ThreadWork; - -import java.util.concurrent.locks.ReentrantLock; - -public class ReentrantLockDemo1 implements Runnable{ - //ReentrantLock(boolean fair),默认非公平,fair==true时,代表公平锁,其性能相比非公平锁较差 - public static ReentrantLock lock=new ReentrantLock(false);//重入锁,unlock与lock的次数要一致 - public static int i; - @Override - public void run() { - for(int j=0;j<1e6;++j) { - try { - lock.lock(); - lock.lock();//加锁 - ++i; - }finally { - lock.unlock();//释放锁 - lock.unlock(); - } - - } - - } - public static void main(String[] args) throws InterruptedException { - Thread t1=new Thread(new ReentrantLockDemo1()); - Thread t2=new Thread(new ReentrantLockDemo1()); - t1.start();t2.start(); - t1.join();t2.join();//join须在start之后 - - System.out.println(i); - - } - - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo2.java b/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo2.java deleted file mode 100644 index 5a80c5c..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ReentrantLockDemo2.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.xycode.ThreadWork; - -import java.util.concurrent.locks.ReentrantLock; - -public class ReentrantLockDemo2 implements Runnable{ - static ReentrantLock lock1=new ReentrantLock(); - static ReentrantLock lock2=new ReentrantLock(); - int lock_flag; - - public ReentrantLockDemo2(int lock_flag) { - super(); - this.lock_flag = lock_flag; - } - - @Override - public void run() { - if(lock_flag==1) { - try { - lock1.lockInterruptibly();//lock,优先响应中断,可以通过发送中断信号来解除死锁 - Thread.sleep(500);//这里sleep,使线程更容易产生死锁 - lock2.lockInterruptibly(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }else { - try { - lock2.lockInterruptibly(); - Thread.sleep(500); - lock1.lockInterruptibly(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - if(lock1.isHeldByCurrentThread()) lock1.unlock(); - if(lock2.isHeldByCurrentThread()) lock2.unlock(); - System.out.println("Thread-"+Thread.currentThread().getId()+" exit!"); - } - - public static void main(String[] args) throws InterruptedException { - Thread t1=new Thread(new ReentrantLockDemo2(1)); - Thread t2=new Thread(new ReentrantLockDemo2(2)); - t1.start();t2.start(); - Thread.sleep(1000); - t2.interrupt();//t2线程被中断,t2将会放弃对锁的申请,并且释放已持有的锁 - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo.java b/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo.java deleted file mode 100644 index 081ba7a..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.xycode.ThreadWork; -/* - * synchronized(object):给指定对象加锁 - * synchronized returnType function(argv):给实例方法加锁,相当于给实例对象加锁(synchronized(this){}单个实例对象互斥) - * synchronized static returnType function(argv):给静态方法加锁,相当于给类加锁(synchronized(object.class){})(相同类不同的实例对象也是互斥的) - */ -public class SynchronizedDemo implements Runnable{ - public static int i=0; - static SynchronizedDemo instance=new SynchronizedDemo(); - public static synchronized void inc() {//给实例方法加锁 - ++i; - } -// public synchronized void inc() {//给静态实例方法加锁 -// ++i; -// } - @Override - public void run() { - for(int j=0;j<10e6;++j) { -// synchronized (instance) { -// ++i; -// } - -// synchronized (this) { -// ++i; -// } - - //static synchronized method实际上与synchronized(object.class)等价 - inc(); -// synchronized (SynchronizedDemo.class) { -// ++i; -// } - - } - - } - public static void main(String[] args) throws InterruptedException { - SynchronizedDemo s=new SynchronizedDemo(); - Thread t1=new Thread(s); - Thread t2=new Thread(s); - t1.start();t2.start(); - t1.join();t2.join();//join须在start之后 - - System.out.println(i); - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo2.java b/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo2.java deleted file mode 100644 index 4b74b0e..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/SynchronizedDemo2.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.xycode.ThreadWork; - -public class SynchronizedDemo2 implements Runnable{ - - public static Integer i=0; - public static SynchronizedDemo2 o=new SynchronizedDemo2(); - @Override - public void run() { - for(int j=0;j<10e6;++j) { - synchronized (o) { - ++i; - } - -// synchronized (i) {//错误的做法,因为Integer本身是不变的,++i导致i的指向不断改变,因此会产生不一致的问题,可能加锁加到了不一样的对象实例上 -// ++i; -// } - - } - - } - public static void main(String[] args) throws InterruptedException { - Thread t1=new Thread(o); - Thread t2=new Thread(o); - t1.start();t2.start(); - t1.join();t2.join();//join须在start之后 - - System.out.println(i); - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolDemo.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolDemo.java deleted file mode 100644 index 4915fd2..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolDemo.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.xycode.ThreadWork; - -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/* - * ScheduledThreadPool:针对计划任务 - */ -public class ThreadPoolDemo { - - public static void main(String[] args) { - ScheduledExecutorService ses=Executors.newScheduledThreadPool(10);//poolSize=10 - ses.scheduleAtFixedRate(new Runnable() { - //scheduleAtFixedRate: - //2s一个周期,初试延时为0, - //若任务执行时间超过了周期,則上一个任务结束后会立即执行,不会再延时. - @Override - public void run() { - try { - Thread.sleep(3000); - System.out.println(System.currentTimeMillis()/1000%1009); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }, 0, 2, TimeUnit.SECONDS); - -// ses.schedule(new Runnable() { -// //schedule: -// //指定延时,然后执行 -// @Override -// public void run() { -// try { -// Thread.sleep(3000); -// System.out.println(System.currentTimeMillis()/1000%1009); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// -// } -// }, 3, TimeUnit.SECONDS); - -// ses.scheduleWithFixedDelay(new Runnable() { -// //scheduleWithFixedDelay: -// //2s一个周期,初试延时为0,不再是单纯的周期性,实质上是在每个任务结束后插入一个延时(period) -// //若任务执行时间超过了周期,則上一个任务结束后仍会插入延时(period),不会再延时. -// @Override -// public void run() { -// try { -// Thread.sleep(3000); -// System.out.println(System.currentTimeMillis()/1000%1009); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// -// } -// }, 0, 2, TimeUnit.SECONDS); - - //线程池若不shutdown,将不会自行退出 - //ses.shutdown();//拒绝接受新的任务,并且等待线程池中的任务执行完毕后就退出. - //ses.shutdownNow();//线程池拒绝接收新提交的任务,同时立马关闭线程池,线程池里的任务不再执行直接退出,慎用!!! - - - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolExtend.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolExtend.java deleted file mode 100644 index deaa885..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolExtend.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.xycode.ThreadWork; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class ThreadPoolExtend { - static class MyTask implements Runnable{ - String name; - - public MyTask(String name) { - super(); - this.name = name; - } - - @Override - public void run() { - System.out.println("Excuting Thread-"+name+"."); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - } - public static void main(String[] args) throws InterruptedException { - ExecutorService es=new ThreadPoolExecutor(5,10,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) { - @Override - protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r);//默认是空的方法 - System.out.println("准备执行 "+((MyTask)r).name+"."); - - } - @Override - protected void afterExecute(Runnable r, Throwable t) { - super.afterExecute(r, t); - System.out.println(((MyTask)r).name+"执行完成."); - } - @Override - protected void terminated() { - super.terminated(); - System.out.println("ThreadPool exit!"); - } - }; - for(int i=0;i<10;++i) { - es.execute(new MyTask("Task-"+(i+1))); - Thread.sleep(100); - } - es.shutdown(); - - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolFactory.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolFactory.java deleted file mode 100644 index d1456ab..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.xycode.ThreadWork; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class ThreadPoolFactory { - static class MyTask implements Runnable{ - - @Override - public void run() { - System.out.println(System.currentTimeMillis()/1000+" : Thread-"+Thread.currentThread().getId()); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - } - public static void main(String[] args) throws InterruptedException { - ExecutorService es=new ThreadPoolExecutor(5,//corePoolSize - 10,//maximumPoolSize - 0,//线程池中线程数量超过corePoolSize但小于maximumPoolSize,多余的线程保持存活的时间 - TimeUnit.SECONDS,//存活时间的时间单位 - new SynchronousQueue<>(),//任务队列,存放被提交但未执行的任务 - new ThreadFactory() {//创建线程的工厂 - - @Override - public Thread newThread(Runnable r) { - Thread t=new Thread(r); - t.setDaemon(true); - System.out.println("create Thread-"+t.getId()); - return t; - } - }, - new RejectedExecutionHandler() {//自定义拒绝策略,当线程池中线程数量超过maximumPoolSize时执行的拒绝策略 - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - System.out.println("Thread-"+new Thread(r).getId()+" is rejected."); - } - } - ); - - for(int i=0;i<20;++i) { - es.submit(new MyTask()); - } - //因为线程池中的线程都设置为守护现场,所以在非守护线程main没有结束之前,线程池也一直不会退出 - //线程池等待main线程休眠3s之后才退出 - Thread.sleep(3000); - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolRejectDemo.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolRejectDemo.java deleted file mode 100644 index 6275cd3..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolRejectDemo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.xycode.ThreadWork; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class ThreadPoolRejectDemo { - static class MyTask implements Runnable{ - - @Override - public void run() { - System.out.println(System.currentTimeMillis()/1000+" : Thread-"+Thread.currentThread().getId()); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - } - - public static void main(String[] args) throws InterruptedException { - ExecutorService es=new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingDeque(10), - new RejectedExecutionHandler() {//自定义拒绝策略 - - @Override - public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - System.out.println(r.toString()+" is discard."); - } - }); - for(int i=0;i<10e5;++i) { - es.submit(new MyTask()); - Thread.sleep(10);//10ms提交一个任务,但是100ms才能执行完一个任务,最终必将超出线程池的处理能力,从而执行reject策略. - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolTrace.java b/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolTrace.java deleted file mode 100644 index a163c56..0000000 --- a/MultiThread_demo/src/com/xycode/ThreadWork/ThreadPoolTrace.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.xycode.ThreadWork; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class ThreadPoolTrace{ - static class DivTask implements Runnable{ - int a,b; - - public DivTask(int a, int b) { - super(); - this.a = a; - this.b = b; - } - - @Override - public void run() { - System.out.println(a/b); - } - - } - public static void main(String[] args) { - //ThreadPoolExecutor(C) extends AbstractExecutorService(C) - //AbstractExecutorService(C) implements ExecutorService(I) - //interface(I) ExecutorService extends Executor(I) - //public interface Executor { void execute(Runnable command); } - -// ExecutorService es=new ThreadPoolExecutor(5, 20, -// 0, TimeUnit.SECONDS, -// new LinkedBlockingDeque()); - - ThreadPoolExecutor es=new ThreadPoolExecutor(5, 20, - 0, TimeUnit.SECONDS, - new LinkedBlockingDeque()); - for(int i=0;i<5;++i) { - try { - es.submit(new DivTask(100, i)).get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - - } - -} diff --git a/MultiThread_demo/src/com/xycode/actor/ActiveObject.java b/MultiThread_demo/src/com/xycode/actor/ActiveObject.java deleted file mode 100644 index 565a892..0000000 --- a/MultiThread_demo/src/com/xycode/actor/ActiveObject.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.xycode.actor; - -import java.util.concurrent.Future; - -public interface ActiveObject { - //接口里面定义的方法默认是abstract的 - public Future makeStr(int cnt,char fillChar); - public void displayStr(String str); - public void shutdown(); - -} diff --git a/MultiThread_demo/src/com/xycode/actor/ActiveObjectFactory.java b/MultiThread_demo/src/com/xycode/actor/ActiveObjectFactory.java deleted file mode 100644 index a764302..0000000 --- a/MultiThread_demo/src/com/xycode/actor/ActiveObjectFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.xycode.actor; - -public class ActiveObjectFactory { - public static ActiveObject createActiveObject() { - return new ActiveObjectImpl(); - } -} diff --git a/MultiThread_demo/src/com/xycode/actor/ActiveObjectImpl.java b/MultiThread_demo/src/com/xycode/actor/ActiveObjectImpl.java deleted file mode 100644 index cf650c0..0000000 --- a/MultiThread_demo/src/com/xycode/actor/ActiveObjectImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.xycode.actor; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.RejectedExecutionException; - -public class ActiveObjectImpl implements ActiveObject{ - private final ExecutorService es=Executors.newCachedThreadPool(); - - @Override - public Future makeStr(int cnt, char fillChar) throws RejectedExecutionException { - - //Future模式,submit()先返回一个凭证 - return es.submit(new Callable() { - - @Override - public String call() { - char[] buf=new char[cnt]; - for(int i=0;i shareQueue=MakerClient.getSharequeue(); - private final ActiveObject activeObject; - public DisplayClient(String name,ActiveObject activeObject) { - super(name); - this.activeObject=activeObject; - } - - @Override - public void run() { - try { - for(int i=0;true;++i) { - String str=Thread.currentThread().getName()+"--"+(i+1); - activeObject.displayStr(str+", displayStr = "+shareQueue.take()); - Thread.sleep(200); - } - }catch (RejectedExecutionException e) { - System.out.println(Thread.currentThread().getName()+" displayTask : "+e); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/MultiThread_demo/src/com/xycode/actor/Main.java b/MultiThread_demo/src/com/xycode/actor/Main.java deleted file mode 100644 index fc2df9d..0000000 --- a/MultiThread_demo/src/com/xycode/actor/Main.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.xycode.actor; - -public class Main { - - public static void main(String[] args) { - ActiveObject activeObject=ActiveObjectFactory.createActiveObject(); - new MakerClient("Alice", activeObject).start(); - new MakerClient("Bob", activeObject).start(); - new DisplayClient("Charis", activeObject).start(); - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - }finally { - activeObject.shutdown();//shutdown后再submit/execute任务就会抛出RejectedExecutionException - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/actor/MakerClient.java b/MultiThread_demo/src/com/xycode/actor/MakerClient.java deleted file mode 100644 index c5383de..0000000 --- a/MultiThread_demo/src/com/xycode/actor/MakerClient.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.xycode.actor; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.RejectedExecutionException; - -public class MakerClient extends Thread{ - private static final LinkedBlockingQueue shareQueue=new LinkedBlockingQueue<>(); - private final ActiveObject activeObject; - private final char fillChar; - - - public static LinkedBlockingQueue getSharequeue() { - return shareQueue; - } - - public MakerClient(String name,ActiveObject activeObject) { - super(name); - this.activeObject=activeObject; - this.fillChar=name.charAt(0); - } - - @Override - public void run() { - try { - for(int i=0;true;++i) { - Future future=activeObject.makeStr(i+1, fillChar); - Thread.sleep(10); - String val=future.get(); - System.out.println(Thread.currentThread().getName()+"--"+(i+1)+", makeStr = "+val); - shareQueue.add(val); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (RejectedExecutionException e) { - System.out.println(Thread.currentThread().getName()+" makeTask : "+e); - } catch (ExecutionException e) { - e.printStackTrace(); - } - } -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/DisruptorDemo.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/DisruptorDemo.java deleted file mode 100644 index 5421c64..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/DisruptorDemo.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; - -import java.nio.ByteBuffer; -import java.text.MessageFormat; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import com.lmax.disruptor.EventFactory; -import com.lmax.disruptor.RingBuffer; -import com.lmax.disruptor.WorkHandler; -import com.lmax.disruptor.dsl.Disruptor; -public class DisruptorDemo { - static class PCData{ - long value; - - public long getValue() { - return value; - } - - public void setValue(long value) { - this.value = value; - } - - } - - static class PCDataFactory implements EventFactory{ - @Override - public PCData newInstance() { - return new PCData(); - } - - } - - static class Producer{ - RingBuffer ringBuffer; - - public Producer(RingBuffer ringBuffer) { - super(); - this.ringBuffer = ringBuffer; - } - - public void pushData(ByteBuffer bb) { - long sequence=ringBuffer.next();//Increment and return the next sequence for the ring buffer - PCData event=ringBuffer.get(sequence); - event.setValue(bb.getLong(0));//index=0,开始读取的索引 - ringBuffer.publish(sequence); - } - - } - - static class Comsumer implements WorkHandler{ - - @Override - public void onEvent(PCData event) throws Exception { - System.out.print("Consumer-Thread-"+Thread.currentThread().getId()+" start, "); - System.out.println(MessageFormat.format("Compute {0}*{1}={2}", - event.getValue(),event.getValue(),event.getValue()*event.getValue())); - } - - } - - - public static void main(String[] args) throws InterruptedException { - ExecutorService es=Executors.newCachedThreadPool(); - PCDataFactory factory=new PCDataFactory(); - int bufferSize=2048; - Disruptor disruptor=new Disruptor<>(factory, bufferSize, es); - disruptor.handleEventsWithWorkerPool( - new Comsumer(),new Comsumer(),new Comsumer(),new Comsumer()); - disruptor.start(); - - RingBuffer ringBuffer=disruptor.getRingBuffer();//disruptor处理Consumer线程 - ByteBuffer bb=ByteBuffer.allocate(8);//8个字节,刚好是Long类型所占的字节长度 - Producer producer=new Producer(ringBuffer);//ringBuffer将Producer和Consumer关联起来 - for(int i=0;i<100;++i) { - System.out.println("Producer add data "+i); - bb.putLong(0,i);//往ByteBuffer里添加long类型的数据(值为i),long占8 byte - producer.pushData(bb); - Thread.sleep(50); - } - - } - -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/FutureDemo.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/FutureDemo.java deleted file mode 100644 index 196beb9..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/FutureDemo.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; -/** - * Future模式的实现 - * @author xycode - * - */ -public class FutureDemo { - static interface Data{ - public String getResult(); - } - static class RealData implements Data{ - String result; - public RealData(String para,int count) {//真实数据,生成的速度较慢 - if(count<0) { - throw new NegativeArraySizeException(String.valueOf(count)); - } - StringBuffer sb=new StringBuffer(); - for(int i=0;i future2=new FutureTask<>(new RealData("xycodec ")); - ExecutorService es=Executors.newCachedThreadPool(); - es.submit(future1); - es.submit(future2); - System.out.println("Request Finished!"); - - //这里可以处理其它业务逻辑 - System.out.println("Handle Others..."); - try { - Thread.sleep(200); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.out.println("Handle Others Finished!"); - - //jdk提供的future编程模式简便多了,带返回值的任务FutureTask (Callable),不带返回值的任务FutureTask (Runnable) - System.out.println("Data = "+future1.get());//若数据还没算好,会在这儿一直等着,直到数据准备完毕 - System.out.println("Data = "+future2.get()); - es.shutdown();//拒绝后续任务的提交,在已有任务完成后线程池才会退出 - - } - -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/LazySingleton.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/LazySingleton.java deleted file mode 100644 index f6eb764..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/LazySingleton.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; - -public class LazySingleton { - - private LazySingleton() {//private的构造方法,避免外部调用多次创建 - System.out.println("LazySingleton is created."); - } - /** - * 若instance非static,getInstance也非static, - * 那么执行getInstance的前提是必须有一个Singleton的对象引用,这无疑产生了悖论, - * 导致的后果是我们永远也无法获得这个对象实例 - * - * 下面的方式是保证是第一次GetInstance()时创建对象,synchronized防止同时创建多次,但是也是性能下降了. - */ - private static LazySingleton instance=null; - /** - * 实验证明,若去掉synchronized,当线程比较密集时,会多次创建 - * - */ - public synchronized static LazySingleton GetInstance() { - if(instance==null) return (instance=new LazySingleton()); - else return instance; - } - - public static void main(String[] args) { -// System.out.println(LazySingleton.GetInstance()); - - //验证单例模式确实有效 - Thread[] t=new Thread[100]; - for(int i=0;i<100;++i) { - t[i]=new Thread() { - public void run() { - try { - System.out.println(LazySingleton.GetInstance()); - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }; - t[i].start(); - } - for(int i=0;i<100;++i) { - try { - t[i].join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - System.out.println("end!"); - } - -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/MatrixMulTask.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/MatrixMulTask.java deleted file mode 100644 index 62d1050..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/MatrixMulTask.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.ForkJoinTask; -import java.util.concurrent.RecursiveTask; - -import org.jmatrices.dbl.Matrix; -import org.jmatrices.dbl.MatrixFactory; -import org.jmatrices.dbl.operator.MatrixOperator; - -public class MatrixMulTask extends RecursiveTask{//ForkAndJoin框架,RecursiveTask带有返回值的 - Matrix m1,m2; - String pos; - static final int Mul_granularity=8; - public MatrixMulTask(Matrix m1, Matrix m2, String pos) { - super(); - this.m1 = m1; - this.m2 = m2; - this.pos = pos; - } - - @Override - protected Matrix compute() { - //不断地将大的矩阵分解为小的矩阵相乘,并为每个小矩阵相乘fork一个线程来计算 - if(m1.rows()<=Mul_granularity||m2.cols()<=Mul_granularity) { - return MatrixOperator.multiply(m1, m2); - }else { - //行数rows,列数cols - Matrix m11=m1.getSubMatrix(1, 1, m1.rows()/2, m1.cols());//矩阵m1的上半部分 - Matrix m12=m1.getSubMatrix(m1.rows()/2+1, 1, m1.rows(), m1.cols());//矩阵m1的下半部分 - - Matrix m21=m2.getSubMatrix(1, 1, m2.rows(), m2.cols()/2);//矩阵m2的左半部分 - Matrix m22=m2.getSubMatrix(1, m2.cols()/2+1, m2.rows(), m2.cols());//矩阵m2的左半部分 - - ArrayList subTasks=new ArrayList<>(); - subTasks.add(new MatrixMulTask(m11, m21, "m1")); - subTasks.add(new MatrixMulTask(m11, m22, "m2")); - subTasks.add(new MatrixMulTask(m12, m21, "m3")); - subTasks.add(new MatrixMulTask(m12, m22, "m4")); - - for(MatrixMulTask t:subTasks) { - t.fork();//fork一个线程来计算 - } - - Map matrix_result=new HashMap<>();//String原生支持Hash与equals,不用重载了 - for(MatrixMulTask t:subTasks) { - matrix_result.put(t.pos, t.join());//join返回就算结果,根据pos来确定是那块计算结果 - } - - Matrix tmp1=MatrixOperator.horizontalConcatenation(matrix_result.get("m1"), matrix_result.get("m2"));//水平方向合并矩阵 - Matrix tmp2=MatrixOperator.horizontalConcatenation(matrix_result.get("m3"), matrix_result.get("m4")); - - Matrix result=MatrixOperator.verticalConcatenation(tmp1, tmp2);//垂直方向合并矩阵,得到真正的结果 - return result; - } - } - - public static void main(String[] args) { - ForkJoinPool pool=new ForkJoinPool(); - Matrix m1=MatrixFactory.getRandomMatrix(512, 256, null); - Matrix m2=MatrixFactory.getRandomMatrix(256, 512, null); - MatrixMulTask task=new MatrixMulTask(m1,m2,null); - ForkJoinTask result=pool.submit(task);//future模式 - try { - System.out.println(result.get()); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - - } - -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelPipeline.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelPipeline.java deleted file mode 100644 index d6d589b..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelPipeline.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; -/* - * 并行流水线,将任务分解,交给不同的线程执行(线程之间有处理逻辑上的先后关系),提高性能 - */ -import java.text.MessageFormat; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingDeque; - -public class ParallelPipeline { - static class Msg{ - double i,j; - String str; - public Msg(double i, double j, String str) { - super(); - this.i = i; - this.j = j; - this.str = str; - } - - } - - static class Plus implements Runnable{ - static BlockingQueue bq=new LinkedBlockingDeque<>(); - - @Override - public void run() { - while(true) { - try { - Msg msg=bq.take(); - msg.j=msg.i+msg.j; - Multiply.bq.add(msg); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - } - } - - static class Multiply implements Runnable{ - static BlockingQueue bq=new LinkedBlockingDeque<>(); - - @Override - public void run() { - while(true) { - try { - Msg msg=bq.take(); - msg.i=msg.i*msg.j; - Div.bq.add(msg); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - } - } - - static class Div implements Runnable{ - static BlockingQueue bq=new LinkedBlockingDeque<>(); - - @Override - public void run() { - while(true) { - try { - Msg msg=bq.take(); - msg.i=msg.i/2; - System.out.println(msg.str+" = "+msg.i); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - } - } - - public static void main(String[] args) { - new Thread(new Plus()).start(); - new Thread(new Multiply()).start(); - new Thread(new Div()).start(); - - for(int i=0;i<1000;++i) { - for(int j=0;j<1000;++j) { - Msg msg=new Msg(i, j, MessageFormat.format("({0}+{1})*{2}/2",i,j,i)); - Plus.bq.add(msg); - } - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelSearch.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelSearch.java deleted file mode 100644 index 58985dc..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ParallelSearch.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; -/** - * 并行搜索,先将序列分段,每段分配一个线程去搜索 - */ -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicInteger; - - -public class ParallelSearch { - static AtomicInteger result=new AtomicInteger(-1);//原子类 - static final int Thread_num=10; - static ExecutorService es=Executors.newCachedThreadPool(); - static int[] arr; - static class SearchTask implements Callable{ - int begin,end,searchValue; - - public SearchTask(int searchValue,int begin, int end) { - super(); - this.begin = begin; - this.end = end; - this.searchValue = searchValue; - } - - @Override - public Integer call() throws Exception { - return search(searchValue, begin, end); - } - - } - public static int search(int searchValue,int begin,int end) {//返回值所在的索引 - for(int i=begin;i=0) return result.get(); - if(arr[i]==searchValue) { - if(result.compareAndSet(-1, i)==false) {//CAS模式操作 - return result.get(); - }else { - return i; - } - } - } - return -1;//没找到,就返回-1 - } - - public static int pSearch(int searchValue) throws InterruptedException, ExecutionException { - int subSize=arr.length/Thread_num+1; - List> re=new ArrayList<>();//子任务的返回值的凭证,Future模式 - for(int i=0;i=arr.length) end=arr.length; - //submit有返回值,为Future,提交到线程池中去计算 - re.add(es.submit(new SearchTask(searchValue,i, end))); - } - for(Future fu:re) { - if(fu.get()>=0) return fu.get();//get(),Future模式,根据先前的凭证去请求计算的结果,若没计算好,就会一直等待 - } - return -1; - } - - public static void main(String[] args) throws InterruptedException, ExecutionException { - Random r=new Random(); - arr=new int[2000000]; - for(int i=0;i<2000000;++i) { - arr[i]=r.nextInt(2000000); - } - for(int i=0;i<100;++i) { - int searchValue=r.nextInt(2000000); - System.out.println("searchValue = "+searchValue+", pos = "+pSearch(searchValue)); - result=new AtomicInteger(-1);//搜索一次后要及时清除状态 - } - } - -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ProducerAndConsumer.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ProducerAndConsumer.java deleted file mode 100644 index 26e9395..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/ProducerAndConsumer.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; - -import java.text.MessageFormat; -import java.util.Random; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - - -public class ProducerAndConsumer { - static class PCData{ - int data; - public PCData(int data) { - super(); - this.data = data; - } - - public int getData() { - return data; - } - - public void setData(int data) { - this.data = data; - } - - @Override - public String toString() { - return "[data = "+data+"]"; - } - } - static class Producer implements Runnable{ - volatile boolean isRunning=true; - BlockingQueue queue;//这里只是一个引用,因为是要和其它 线程/类 共享的 - static AtomicInteger count=new AtomicInteger(0); - static final int sleep_time=1000; - - - public Producer(BlockingQueue queue) { - super(); - this.queue = queue; - } - - - @Override - public void run() { - PCData data=null; - Random r=new Random(); - System.out.println("start,ProducerID = "+Thread.currentThread().getId()); - while(isRunning) { - try { - Thread.sleep(r.nextInt(sleep_time)); - data=new PCData(count.incrementAndGet());//相当于++count - System.out.print("Producer: "); - System.out.println(data+ "is put into queue."); - if(queue.offer(data, 2, TimeUnit.SECONDS)==false) { - System.out.println("failed to put "+data+" into queue."); - } - } catch (InterruptedException e) { - e.printStackTrace(); -// Thread.currentThread().interrupt(); - } - } - } - - public void stop() { - isRunning=false; - } - - } - - static class Consumer implements Runnable{ - BlockingQueue queue;//这里只是一个引用,因为是要和其它 线程/类 共享的 - static final int sleep_time=1000; - - - public Consumer(BlockingQueue queue) { - super(); - this.queue = queue; - } - - @Override - public void run() { - System.out.println("start,ConsumerID = "+Thread.currentThread().getId()); - Random r=new Random(); - while(true) { - try { - PCData data=queue.take(); - if(data!=null) { - int result=data.getData()*data.getData(); - System.out.print("Consumer: compute "); - System.out.println(MessageFormat.format("{0}*{1}={2}", - data.getData(),data.getData(),result)); - Thread.sleep(r.nextInt(sleep_time)); - } - } catch (InterruptedException e) { - e.printStackTrace(); -// Thread.currentThread().interrupt(); - } - - } - } - } - public static void main(String[] args) throws InterruptedException { - BlockingQueue queue=new LinkedBlockingDeque<>(10); - /* - * 共享一个队列,这个队列就是联系Producer和Consumer的纽带 - * 并且由于有这个queue充当缓冲区,允许Producer和Consumer线程之间性能存在差异,起到一个调和的作用. - */ - Producer p1=new Producer(queue); - Producer p2=new Producer(queue); - Producer p3=new Producer(queue); - - Consumer c1=new Consumer(queue); - Consumer c2=new Consumer(queue); - Consumer c3=new Consumer(queue); - - ExecutorService es=Executors.newCachedThreadPool(); - es.execute(p1); - es.execute(p2); - es.execute(p3); - - es.execute(c1); - es.execute(c2); - es.execute(c3); - Thread.sleep(10000);//计算时间10s - - p1.stop();//Producer线程停止生产数据 - p2.stop(); - p3.stop(); - - Thread.sleep(3000); -// es.shutdown();//这里的shutdown其实没用,因为Consumer线程一直在运行,所以线程池只是停止接受任务,而不会退出 - - } - -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/Singleton.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/Singleton.java deleted file mode 100644 index b8382df..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/Singleton.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; -/* - * 单例模式 - * - */ - - -public class Singleton { - private Singleton() {//private的构造方法,避免外部调用多次创建 - System.out.println("Singleton is created."); - } - /** - * 若instance非static,getInstance也非static, - * 那么执行getInstance的前提是必须有一个Singleton的对象引用,这无疑产生了悖论, - * 导致的后果是我们永远也无法获得这个对象实例 - * - * 实际上instance何时创建是不一定的,可能是第一次GetInstance()时,或者第一次应用static对象时(如这里的STATUS) - */ - public static int STATUS=1; - private static Singleton instance=new Singleton(); - public static Singleton GetInstance() { - return instance; - } - - public static void main(String[] args) { -// System.out.println(Singleton.STATUS);//可以看出,先created,然后打印出了STATUS -// System.out.println(Singleton.GetInstance());//这里就只返回instance,不创建了 - - //验证单例模式确实有效 - Thread[] t=new Thread[100]; - for(int i=0;i<100;++i) { - t[i]=new Thread() { - public void run() { - try { - System.out.println(Singleton.GetInstance()); - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }; - t[i].start(); - } - for(int i=0;i<100;++i) { - try { - t[i].join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - System.out.println("end!"); - } -} diff --git a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/StaticSingleton.java b/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/StaticSingleton.java deleted file mode 100644 index 0822c5d..0000000 --- a/MultiThread_demo/src/com/xycode/parallelModeAndAlgorithm/StaticSingleton.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.xycode.parallelModeAndAlgorithm; - -public class StaticSingleton { - private StaticSingleton() {//private的构造方法,避免外部调用多次创建 - System.out.println("StaticSingleton is created."); - } - /** - * 若instance非static,getInstance也非static, - * 那么执行getInstance的前提是必须有一个Singleton的对象引用,这无疑产生了悖论, - * 导致的后果是我们永远也无法获得这个对象实例 - * - * 实际上instance何时创建是不一定的,可能是第一次GetInstance()时,或者第一次应用static对象时, - * 下面这种方式反过来利用这种缺点来实现只在第一次GetInstance()时创建 - */ - public static int STATUS=1; - private static class SingletonHolder{//private,使外部无法访问,单例对象隐藏在这个内部类中 - private static StaticSingleton instance=new StaticSingleton(); - } - - public static StaticSingleton GetInstance() { - return SingletonHolder.instance;//因为Java内存模型保证对象的创建是线程安全的,所以这种方式的单例模式也是线程安全的 - } - public static void main(String[] args) { - System.out.println(StaticSingleton.STATUS);//只打印了STATUS,证明此时没有创建对象 -// System.out.println(StaticSingleton.GetInstance());//这时候就创建对象了 - - //验证单例模式确实有效 - Thread[] t=new Thread[100]; - for(int i=0;i<100;++i) { - t[i]=new Thread() { - public void run() { - try { - System.out.println(StaticSingleton.GetInstance()); - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }; - t[i].start(); - } - for(int i=0;i<100;++i) { - try { - t[i].join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - System.out.println("end!"); - } - -} diff --git a/MultiThread_demo/src/com/xycode/pro/BoundedExecutor.java b/MultiThread_demo/src/com/xycode/pro/BoundedExecutor.java deleted file mode 100644 index c379197..0000000 --- a/MultiThread_demo/src/com/xycode/pro/BoundedExecutor.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.xycode.pro; -/* - * 使用信号量(Semaphore)来限制任务提交的速率 - */ -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.Semaphore; - -public class BoundedExecutor { - final ExecutorService exec; - final Semaphore semp; - - public BoundedExecutor(ExecutorService exec, Semaphore semp) { - super(); - this.exec = exec; - this.semp = semp; - } - - public void shutdown(){ - exec.shutdown(); - } - - public void submitTask(final Runnable task) throws InterruptedException { - semp.acquire(); - try { - exec.execute(new Runnable() {//对task重新包装,嵌入信号量计数 - @Override - public void run() { - try { - task.run(); - }finally { - semp.release(); - } - } - }); - }catch(RejectedExecutionException e) { - semp.release(); - e.printStackTrace(); - } - } - - public static void main(String[] args) { - BoundedExecutor tasks=new BoundedExecutor(Executors.newCachedThreadPool(), new Semaphore(10)); - for(int i=0;i<100;++i) { - try { - tasks.submitTask(new Runnable() { - - @Override - public void run() { - System.out.println("Task-"+Thread.currentThread().getId()+" is Running."); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - //能发现明显的间隔式地运行一组任务(一组10个) - - tasks.shutdown(); - - } - -} diff --git a/MultiThread_demo/src/com/xycode/pro/CacheTest.java b/MultiThread_demo/src/com/xycode/pro/CacheTest.java deleted file mode 100644 index 59a36d5..0000000 --- a/MultiThread_demo/src/com/xycode/pro/CacheTest.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.xycode.pro; - -import java.util.Map; -import java.util.Random; -import java.util.concurrent.Callable; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -public class CacheTest { - /* - * 使用线程安全的ConcurrentHashMap来进行缓存,效果比HashMap+synchronized好一些, - * 然而,当单个线程计算所需时间较久时,很有可能造成重复计算 - */ - static class Memorizer_1 implements Computable{ - final Map cache=new ConcurrentHashMap<>(); - - @Override - public R compute(final A arg) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return (R)arg; - } - - @Override - public R get(final A arg) { - R result=cache.get(arg); - if(result==null) { - result=compute(arg); - cache.put(arg, result); - } - return result; - } - - } - /* - * - * 使用参数到Future的ConcurrentHashMap, - * 因为future是立马获得的,所以不会因为计算时间过长而造成重复计算 - * 并且使用ConcurrentHashMap::putIfAbsent(K,V),因为该方法是原子性的,故杜绝了重复添加future的可能性 - */ - static class Memorizer_2 implements Computable{ - final Map> cache=new ConcurrentHashMap<>(); - - @Override - public R compute(final A arg) { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return (R)arg; - } - - @Override - public R get(final A arg) { - while(true) { - Future f=cache.get(arg); - if(f==null) { - FutureTask ft=new FutureTask<>(new Callable() { - - @Override - public R call() throws Exception { - return compute(arg); - } - - }); - - f=cache.putIfAbsent(arg, ft); - if(f==null) {//putIfAbsent返回null,说明先前值是null(在这里说明先前不存在这个映射,现在是第一次添加) - f=ft; - ft.run();//会调用call(),详见jdk源码 - } - } - - try { - return f.get();//阻塞等待(还没算好的话),否则立即返回结果 - }catch(CancellationException e) { - e.printStackTrace(); - cache.remove(arg,f);//防止缓存污染 - }catch(RuntimeException e){ - e.printStackTrace(); - cache.remove(arg,f);//防止缓存污染 - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - - } - - static CountDownLatch gate; - static class Task implements Runnable{ - Computable m; - A arg; - public Task(Computable m, A arg) { - super(); - this.m = m; - this.arg = arg; - } - - @Override - public void run() { - try { - m.get(arg); - }finally { - gate.countDown();//计数减一 - } - //System.out.println(m.get(arg)); - } - - } - - - public static void test(ExecutorService es,Computable m) { - gate=new CountDownLatch(1000);//使用CountDownLatch来辅助计时 - Random r=new Random(); - long begin=System.currentTimeMillis(); - for(int i=0;i<1000;++i) { - es.submit(new Task(m,r.nextInt(50)));//计算结果重复率越高,缓存的效果越好 - } - try { - gate.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - long end=System.currentTimeMillis(); - if(m instanceof Memorizer_1)//instanceof识别是哪个类 - System.out.println("Memorizer_1's total time: "+(end-begin)/1000+" s."); - else - System.out.println("Memorizer_2's total time: "+(end-begin)/1000+" s."); - es.shutdown(); - } - - public static void main(String[] args) { - - //第一种方式大概需要6s ~ 8s -// ExecutorService es_1=new ThreadPoolExecutor(10,20,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) { -// @Override -// protected void terminated() { -// System.out.println(System.currentTimeMillis()/1000%1000); -// System.out.println("ThreadPool exit!"); -// System.out.println(); -// } -// }; -// -// test(es_1,new Memorizer_1()); -// System.out.println(System.currentTimeMillis()/1000%1000); - - - //第二种方式大概需要3s ~ 4s,性能是第一种的两倍多 -// ExecutorService es_2=new ThreadPoolExecutor(10,20,0,TimeUnit.SECONDS,new LinkedBlockingDeque()) { -// @Override -// protected void terminated() { -// System.out.println(System.currentTimeMillis()/1000%1000); -// System.out.println("ThreadPool exit!"); -// } -// }; -// test(es_2,new Memorizer_2()); -// System.out.println(System.currentTimeMillis()/1000%1000); - - - -// ExecutorService es_1=Executors.newFixedThreadPool(20); -// test(es_1,new Memorizer_1());//5s -// -// ExecutorService es_2=Executors.newFixedThreadPool(20); -// test(es_2,new Memorizer_2());//2s,性能仍是2倍+的差距 - - - ExecutorService es_1=new TimingThreadPool - (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque()); - ExecutorService es_2=new TimingThreadPool - (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque()); - test(es_1,new Memorizer_1());//更精确的,从任务的平均运行时间也可看出性能的差距 - test(es_2,new Memorizer_2()); - - } - -} diff --git a/MultiThread_demo/src/com/xycode/pro/Computable.java b/MultiThread_demo/src/com/xycode/pro/Computable.java deleted file mode 100644 index 41db83a..0000000 --- a/MultiThread_demo/src/com/xycode/pro/Computable.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.xycode.pro; - -public interface Computable { - public R compute(A arg); - public R get(A arg); -} diff --git a/MultiThread_demo/src/com/xycode/pro/ConditionBoundedBuffer.java b/MultiThread_demo/src/com/xycode/pro/ConditionBoundedBuffer.java deleted file mode 100644 index ca44d70..0000000 --- a/MultiThread_demo/src/com/xycode/pro/ConditionBoundedBuffer.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.xycode.pro; -import java.util.Random; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.TimeUnit; -/** - * 基于ReentrantLock与Condition的有界环形缓存(应对多线程环境) - */ -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -public class ConditionBoundedBuffer { - private final Lock lock=new ReentrantLock(); - private final Condition notFull=lock.newCondition(); - private final Condition notEmpty=lock.newCondition(); - private final T[] items; - private int head,tail,count; - - public ConditionBoundedBuffer(int buf_size) { - items=(T[])new Object[buf_size]; - head=0; - tail=0; - count=0; - } - - public void put(T item) throws InterruptedException { - lock.lock();//lock保证某一时刻只能有一个线程修改缓存 - try { - while(count==items.length) {//缓存已满 - notFull.await();//阻塞notFull(主要针对put方法),此时不能再添加了,会一直阻塞在这儿 - } - items[tail++]=item; - if(tail==items.length) {//环形缓存 - tail=0; - } - ++count; - notEmpty.signal();//对外通告notEmpy(主要针对take方法),此时缓存中有数据,可以take - }finally { - lock.unlock(); - } - } - - - public T take() throws InterruptedException { - lock.lock();//lock保证某一时刻只能有一个线程修改缓存 - try { - while(count==0) { - notEmpty.await();//阻塞notEmpty,因为缓存已经空了,不能再take - } - T item=items[head]; - items[head]=null; - if(++head==items.length) {//环形缓存 - head=0; - } - --count; - notFull.signal();//对外通告notFull(主要针对put方法),此时可以put - return item; - }finally { - lock.unlock(); - } - } - - static final Random r=new Random(); - static class Task implements Runnable{ - ConditionBoundedBuffer cb; - int mode; - public Task(ConditionBoundedBuffer cb,int mode) { - super(); - this.cb = cb; - this.mode=mode; - } - - @Override - public void run() { - if(mode==1) {//mode==1,take... - for(int i=0;i<1000;++i) { - try { - T item=cb.take(); -// System.out.println("take "+item); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }else {//else,put... - for(int i=0;i<1000;++i) { - Object o=r.nextInt(1000); - //java的泛型是基于类型擦除的(先是变成Object类型) - //所以泛型类型只能强制转换Object类型 - try { - cb.put((T)o); -// System.out.println("put "+o); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - System.out.println("Thread-"+Thread.currentThread().getId()+", has finished Task!"); - - } - } - - public static void main(String[] args) { - ConditionBoundedBuffer cb=new ConditionBoundedBuffer<>(1000); - ExecutorService es=new TimingThreadPool - (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque()); - for(int i=0;i<1000;++i) { - es.submit(new Task(cb, 1)); - es.submit(new Task(cb, 0)); - } - - es.shutdown(); - - } - -} diff --git a/MultiThread_demo/src/com/xycode/pro/CountDownLatch_demo.java b/MultiThread_demo/src/com/xycode/pro/CountDownLatch_demo.java deleted file mode 100644 index 033ec59..0000000 --- a/MultiThread_demo/src/com/xycode/pro/CountDownLatch_demo.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.xycode.pro; - -import java.util.Random; -import java.util.concurrent.CountDownLatch; - -public class CountDownLatch_demo { - Random r=new Random(); - public long Tasks(int nThread,final Runnable task) throws InterruptedException { - final CountDownLatch startGate=new CountDownLatch(1); - final CountDownLatch endGate=new CountDownLatch(nThread); - for(int i=0;i implements MyMap{ - private final Map map; - private final ReadWriteLock lock=new ReentrantReadWriteLock(); - private final Lock readLock=lock.readLock(); - private final Lock writeLock=lock.writeLock(); - - public readWriteMap(Map map) { - this.map = map; - } - - @Override - public V put(K key,V value) { - writeLock.lock(); - try { - return map.put(key, value); - }finally { - writeLock.unlock(); - } - } - - @Override - public V get(K key) { - readLock.lock(); - try { - return map.get(key); - }finally { - readLock.unlock(); - } - } - - @Override - public V remove(K key) { - writeLock.lock(); - try { - return map.remove(key); - }finally { - writeLock.unlock(); - } - } - - @Override - public void clear() { - writeLock.lock(); - try { - map.clear(); - }finally { - writeLock.unlock(); - } - } - - } - - static class lockMap implements MyMap{ - private final Map map; - private final ReentrantLock lock=new ReentrantLock(); - - public lockMap(Map map) { - super(); - this.map = map; - } - - @Override - public V put(K key,V value) { - lock.lock(); - try { - return map.put(key, value); - }finally { - lock.unlock(); - } - } - - @Override - public V get(K key) { - lock.lock(); - try { - return map.get(key); - }finally { - lock.unlock(); - } - } - - @Override - public V remove(K key) { - lock.lock(); - try { - return map.remove(key); - }finally { - lock.unlock(); - } - } - - @Override - public void clear() { - lock.lock(); - try { - map.clear(); - }finally { - lock.unlock(); - } - } - - } - - static final Random r=new Random(); - static CountDownLatch gate; - static class Task implements Runnable{ - MyMap map; - List key_list; - - public Task(MyMap map,List key_list) { - this.map=map; - for(K key: key_list) { - map.put(key, (V)String.valueOf(key)); - } - this.key_list=key_list; - } - - @Override - public void run() { - try { - Collections.shuffle(key_list); - for(K key: key_list) { - if(r.nextDouble()<0.1) {//10%的概率write - map.remove(key); - }else { - map.get(key); - } - } - }finally { - gate.countDown();//计数减一 - } - } - - } - - - public static void test(ExecutorService es,MyMap m,int task_num) { - gate=new CountDownLatch(task_num);//使用CountDownLatch来辅助计时 - Random r=new Random(); - long begin=System.currentTimeMillis(); - for(int i=0;i key_list=new ArrayList<>(); - for(int j=0;j<5000;++j) { - key_list.add(r.nextInt(5000)); - } - es.submit(new Task(m,key_list)); - } - try { - gate.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - long end=System.currentTimeMillis(); - if(m instanceof readWriteMap) - System.out.println("readWriteMap's total time: "+(end-begin)+" ms."); - else if(m instanceof lockMap) - System.out.println("lockMap's total time: "+(end-begin)+" ms."); - else - System.out.println("illegal class!"); - es.shutdown(); - } - - public static void main(String[] args) { - ExecutorService es_1=new TimingThreadPool - (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque()); - ExecutorService es_2=new TimingThreadPool - (10, 20, 0, TimeUnit.SECONDS, new LinkedBlockingDeque()); - test(es_1,new readWriteMap(new HashMap<>()),1000); - test(es_2,new lockMap(new HashMap<>()),1000); - } - -} diff --git a/MultiThread_demo/src/com/xycode/pro/MyLogger.java b/MultiThread_demo/src/com/xycode/pro/MyLogger.java deleted file mode 100644 index 84abfc3..0000000 --- a/MultiThread_demo/src/com/xycode/pro/MyLogger.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.xycode.pro; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.logging.ConsoleHandler; -import java.util.logging.Formatter; -import java.util.logging.LogRecord; -import java.util.logging.Logger; - -public class MyLogger { - - public static Logger logger=Logger.getLogger("MyLogger"); - private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss(SSS"); - //public static java.lang.System.Logger log=System.getLogger("log"); - - /* - * 鏃ュ織绾у埆: - * OFF - * SEVERE - WARNING - INFO - CONFIG - FINE - FINER - FINEST - ALL - - - Logger榛樿鐨勭骇鍒槸INFO锛屾瘮INFO鏇翠綆鐨勬棩蹇楀皢涓嶆樉绀 - */ - - static { - ConsoleHandler handler=null; - try { - handler=new ConsoleHandler(); - handler.setFormatter(new Formatter() { - - @Override - public String format(LogRecord record) { - StringBuilder builder = new StringBuilder(1000); - builder.append(df.format(new Date(record.getMillis()))).append("ms)"); - builder.append("[").append(record.getLevel()).append("]: "); - builder.append(formatMessage(record)); - //builder.append("\n\t\t\tat [").append(record.getSourceClassName()).append("."); - //builder.append(record.getSourceMethodName()).append("]"); - builder.append("\n"); - return builder.toString(); - } - }); - } catch (SecurityException e) { - e.printStackTrace(); - } - logger.setUseParentHandlers(false); - logger.addHandler(handler); - } - - public static void main(String[] args) { - ConsoleHandler handler=null; - try { - handler=new ConsoleHandler(); - handler.setFormatter(new Formatter() { - - @Override - public String format(LogRecord record) { - StringBuilder builder = new StringBuilder(1000); - builder.append(df.format(new Date(record.getMillis()))).append("ms)"); - builder.append("[").append(record.getLevel()).append("]: "); - builder.append(formatMessage(record)); - builder.append("\n\t\t\tat [").append(record.getSourceClassName()).append("."); - builder.append(record.getSourceMethodName()).append("]"); - builder.append("\n"); - return builder.toString(); - } - }); - } catch (SecurityException e) { - e.printStackTrace(); - } - logger.setUseParentHandlers(false); - logger.addHandler(handler); - logger.info("sssssssssss"); - } - -} diff --git a/MultiThread_demo/src/com/xycode/pro/MyMap.java b/MultiThread_demo/src/com/xycode/pro/MyMap.java deleted file mode 100644 index 8327c6c..0000000 --- a/MultiThread_demo/src/com/xycode/pro/MyMap.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.xycode.pro; - -public interface MyMap { - public V put(K key,V value); - public V remove(K key); - public V get(K key); - public void clear(); -} diff --git a/MultiThread_demo/src/com/xycode/pro/MyRandom.java b/MultiThread_demo/src/com/xycode/pro/MyRandom.java deleted file mode 100644 index 76a3836..0000000 --- a/MultiThread_demo/src/com/xycode/pro/MyRandom.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.xycode.pro; - -import java.util.Random; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -public class MyRandom { - static class lockRandom extends Random{ - private final Lock lock=new ReentrantLock(); - private int seed; - public lockRandom(int seed) { - super(); - this.seed = seed; - } - - @Override - public int nextInt(int bound) { - lock.lock(); - try { - int s=seed; - seed=(int) nextLong(); - int remainder=s%bound; - return remainder>0?remainder:remainder+bound; - }finally { - lock.unlock(); - } - } - } - - static class atomicRandom extends Random{ - private AtomicInteger seed; - public atomicRandom(int seed) { - super(); - this.seed = new AtomicInteger(seed); - } - - @Override - public int nextInt(int bound) { - int s=seed.get(); - int nextSeed=(int) nextLong(); - if(seed.compareAndSet(s, nextSeed)) {//乐观锁,CAS - int remainder=s%bound; - return remainder>0?remainder:remainder+bound; - } - return bound; - } - } - - public static void main(String[] args) { - lockRandom lr=new lockRandom(1000); - for(int i=0;i<100;++i) { - System.out.println(lr.nextInt(1000)); - } - atomicRandom ar=new atomicRandom(1000); - for(int i=0;i<100;++i) { - System.out.println(ar.nextInt(1000)); - } - - } - -} diff --git a/MultiThread_demo/src/com/xycode/pro/TimingThreadPool.java b/MultiThread_demo/src/com/xycode/pro/TimingThreadPool.java deleted file mode 100644 index 5ede989..0000000 --- a/MultiThread_demo/src/com/xycode/pro/TimingThreadPool.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.xycode.pro; -/** - * 重新包装后的线程池,主要加了计时功能 - */ -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - -public class TimingThreadPool extends ThreadPoolExecutor{ - - - public TimingThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, - BlockingQueue workQueue) { - super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); - } - - final ThreadLocal start_time=new ThreadLocal<>(); - final AtomicLong numTasks=new AtomicLong(); - final AtomicLong total_time=new AtomicLong(); - @Override - protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); - MyLogger.logger.fine(String.format("Thread %s: start %s", t,r)); - start_time.set(System.currentTimeMillis()); - } - - @Override - protected void afterExecute(Runnable r, Throwable t) { - super.afterExecute(r, t); - long end_time=System.currentTimeMillis(); - long taskTime=end_time-start_time.get(); - numTasks.incrementAndGet();//++i - total_time.addAndGet(taskTime); - MyLogger.logger.fine(String.format("Thread %s end %s, time=%d ns", t,r,taskTime)); - //默认日志等级为info,故fine等级的消息默认不会显示 - } - - @Override - protected void terminated() { - super.terminated(); - MyLogger.logger.info(String.format("Terminated:total_time:%d ns,avg_time=%d ns", - total_time.get(),total_time.get()/numTasks.get())); - } - - public static void main(String[] args) { - - } - -} diff --git a/MultiThread_demo/src/com/xycode/stopThread/GoodSuspend.java b/MultiThread_demo/src/com/xycode/stopThread/GoodSuspend.java deleted file mode 100644 index 47d7a84..0000000 --- a/MultiThread_demo/src/com/xycode/stopThread/GoodSuspend.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.xycode.stopThread; - -import java.math.BigInteger; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingDeque; - -/* - * 使用中断才是比较好的suspend方式 - */ -public class GoodSuspend { - static class PrimeProducer extends Thread{ - private final BlockingQueue queue; - public PrimeProducer(BlockingQueue queue) { - super(); - this.queue = queue; - } - - @Override - public void run() { - BigInteger p=BigInteger.ONE; - try { - while(true) { - if(!Thread.currentThread().isInterrupted()) - queue.put(p=p.nextProbablePrime()); - else { - System.out.println("Thread-"+Thread.currentThread().getId()+" interrupted,exit!"); - break; - } - } - } catch (InterruptedException e) { - System.err.println("Capacity is full!"); - e.printStackTrace(); - } - } - - public void cancel() { - interrupt(); - } - } - public static void main(String[] args) throws InterruptedException { - BlockingQueue queue=new LinkedBlockingDeque<>(100); - PrimeProducer t=new PrimeProducer(queue); - t.start(); - - for(int i=0;i<200;++i) { - System.out.println(queue.take());//put的速度快于take的速度 - Thread.sleep(10); - } - - t.cancel(); - } - -} diff --git a/MultiThread_demo/src/com/xycode/stopThread/NotBadSuspend.java b/MultiThread_demo/src/com/xycode/stopThread/NotBadSuspend.java deleted file mode 100644 index afbca4f..0000000 --- a/MultiThread_demo/src/com/xycode/stopThread/NotBadSuspend.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.xycode.stopThread; -/* - * 通过标志变量来退出 - * 缺点:当线程阻塞时,可能永远都无法执行到判断标志变量的那行代码,也就无法退出了 - * (例如:LinkedBlockingQueue当队列满了时,再往里面添加数据,此时线程就会阻塞) - */ -public class NotBadSuspend { - public static Object o=new Object(); - public static class WriteThread extends Thread{ - volatile boolean suspendme=false; - public volatile boolean flag=true; - public void suspendMe() { - suspendme=true; - } - - public void resumeMe() { - suspendme=false; - synchronized (o) { - o.notify();//notify后,线程不会立即释放锁 - try { - System.out.println("WriteThread sleep 2s.(maintaining o's lock)"); - this.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - - } - @Override - public void run() { - while(true) { - synchronized(o){ - while(suspendme) { - try { - o.wait();//wait,并释放了o的锁,suspendme==true时,线程就停在这儿了 - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - if(flag) {//suspendme==false时,线程就正常执行,若之前wait了,就需要notify来唤醒线程 - System.out.println("in WriteThread."); - //flag=false; - } - } - - } - - } - } - - public static class ReadThread extends Thread{ - public volatile boolean flag=true; - @Override - public void run() { - while(true) { - synchronized(o){ - if(flag) { - System.out.println("in ReadThread."); - flag=false; - } - } - } - } - } - - public static void main(String[] args) throws InterruptedException { - WriteThread t1=new WriteThread(); - ReadThread t2=new ReadThread(); - t1.start(); - t2.start(); - Thread.sleep(1000); - t1.suspendMe(); - System.out.println("WriteThread suspend 2s."); - Thread.sleep(2000); - System.out.println("WriteThread resume."); - t1.resumeMe();//resume完全执行完毕后才会释放o的锁 - - } - -} diff --git a/MultiThread_demo/src/com/xycode/stopThread/SemaphoreDemo.java b/MultiThread_demo/src/com/xycode/stopThread/SemaphoreDemo.java deleted file mode 100644 index 59b8108..0000000 --- a/MultiThread_demo/src/com/xycode/stopThread/SemaphoreDemo.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.xycode.stopThread; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -/* - * 信号量Semaphore,允许多个线程同时访问 - */ -public class SemaphoreDemo implements Runnable{ - final Semaphore semp=new Semaphore(5);//允许最多5个线程同时访问 - @Override - public void run() { - try { - semp.acquire(); - Thread.sleep(1000);//获得一个许可 - System.out.println("Thread-"+Thread.currentThread().getId()+" done!"); - } catch (InterruptedException e) { - e.printStackTrace(); - }finally { - semp.release();//释放一个许可 - } - } - public static void main(String[] args) throws InterruptedException { - ExecutorService exec=Executors.newFixedThreadPool(10); -// ExecutorService exec=Executors.newCachedThreadPool(); - final SemaphoreDemo demo=new SemaphoreDemo(); - for(int i=0;i<20;++i) { - exec.submit(new Thread(demo)); - } - exec.awaitTermination(10, TimeUnit.SECONDS);//线程池等待指定时间(等待时间最好超过线程池中任务执行的时间) - System.out.println("Aloha!"); - exec.shutdown();//拒绝接受新的任务,并且等待线程池中的任务执行完毕后就退出. - //exec.shutdownNow();//线程池拒绝接收新提交的任务,同时立马关闭线程池,线程池里的任务不再执行直接退出,慎用!!! - } - -} diff --git a/MultiThread_demo/src/com/xycode/stopThread/StopThreadSafe.java b/MultiThread_demo/src/com/xycode/stopThread/StopThreadSafe.java deleted file mode 100644 index d8e77df..0000000 --- a/MultiThread_demo/src/com/xycode/stopThread/StopThreadSafe.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.xycode.stopThread; - -/* - * 采用中断机制来安全的退出线程,需要注意的是当一个线程收到一个中断信号时,线程并不会立即退出,只是表明希望这个线程退出了, - * 到底退出与否,则由该线程自行决定 - */ -public class StopThreadSafe { - public static class User{ - private int id; - private String name; - public User() { - id=0; - name="0"; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "id="+id+", name="+name; - } - - } - public static User u=new User(); - - public static class WriteThread extends Thread{ - @Override - public void run() { - while(true) { - if(this.isInterrupted()) {//判断当前线程是否被中断,而interrupted()不光判断是否被中断,并且会清除当前中断状态 - System.out.println("Thread-"+this.currentThread().getId()+" interruted!"); - break; - } - - synchronized(u){ - int v=(int)(System.currentTimeMillis()/1000); - u.setId(v); -// try { -// Thread.sleep(100); -// }catch (Exception e) { -// e.printStackTrace(); -// } - for(int i=0;i<10e8;++i); - u.setName(String.valueOf(v)); - } - this.yield();//线程间的一种谦让机制 - } - - } - } - - - public static class ReadThread implements Runnable{ - @Override - public void run() { - while(true) { - synchronized(u){ - if(u.getId()!=Integer.parseInt(u.getName())) { - System.out.println(u); - } - } - Thread.yield();//线程间的一种谦让机制 - } - - } - } - - public static void main(String[] args) throws InterruptedException { - (new Thread(new ReadThread())).start(); - while(true) { - Thread t=new WriteThread(); - t.start(); - Thread.sleep(200); - t.interrupt();//main线程给线程t发中断信号,希望它停止运行 - } - - } - -} diff --git a/MultiThread_demo/src/com/xycode/stopThread/StopThreadUnsafe.java b/MultiThread_demo/src/com/xycode/stopThread/StopThreadUnsafe.java deleted file mode 100644 index 565394e..0000000 --- a/MultiThread_demo/src/com/xycode/stopThread/StopThreadUnsafe.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.xycode.stopThread; -/* Thread.stop()是不安全的,可能会引起数据不一致的情况 - * extends Thread与implements Runnable的主要区别是: - * 1.Thread是类,Runnable是接口,若一个线程类采用extends Thread的方式来实现,由于java不支持多继承,这个线程类将无法在继承其他类。 - * 而implements Runnable就没有这种限制 - * 2.extends Thread的方式可以使得线程类直接使用Thread的一些方法,this.xxx即可 - */ -public class StopThreadUnsafe{ - public static class User{ - private int id; - private String name; - public User() { - id=0; - name="0"; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "id="+id+", name="+name; - } - - } - public static User u=new User(); - - public static class WriteThread extends Thread{ - @Override - public void run() { - while(true) { - synchronized(u){ - int v=(int)(System.currentTimeMillis()/1000); - u.setId(v); - try { - this.sleep(100); - }catch (Exception e) { - e.printStackTrace(); - } - u.setName(String.valueOf(v)); - } - this.yield();//线程间的一种谦让机制 - } - - } - } - - - public static class ReadThread implements Runnable{ - @Override - public void run() { - while(true) { - synchronized(u){ - if(u.getId()!=Integer.parseInt(u.getName())) { - System.out.println(u); - } - } - Thread.yield();//线程间的一种谦让机制 - } - - } - } - - public static void main(String[] args) throws InterruptedException { - (new Thread(new ReadThread())).start(); - while(true) { - Thread t=new WriteThread(); - t.start(); - Thread.sleep(200); - t.stop();//一种废弃的方法,因为退出的机制不安全,可能出现数据不一致. - } - - } - -} diff --git a/MultiThread_demo/src/com/xycode/stopThread/WaitAndNotify.java b/MultiThread_demo/src/com/xycode/stopThread/WaitAndNotify.java deleted file mode 100644 index 6046c77..0000000 --- a/MultiThread_demo/src/com/xycode/stopThread/WaitAndNotify.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.xycode.stopThread; -/* - * wait,notify一般是和synchronized搭配使用 - * 在线程T1中,object.wait(),T1不光会wait这个object,而且T1会释放object的锁 - * 而对于object.notify(),线程必须先获得object的锁才能notify - * wait与notify都是由某个对象来调用的,并对调用的当前线程起作用 - */ - -public class WaitAndNotify { - final static Object o=new Object(); - public static class T1 implements Runnable{ - - @Override - public void run() { - synchronized (o) { - System.out.println(System.currentTimeMillis()+": T1 start."); - try { - System.out.println(System.currentTimeMillis()+": T1 wait for o."); - o.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.out.println(System.currentTimeMillis()+": T1 end."); - } - } - - } - - public static class T2 implements Runnable{ - - @Override - public void run() { - synchronized (o) { - System.out.println(System.currentTimeMillis()+": T2 start,notify T1."); - o.notify(); - System.out.println(System.currentTimeMillis()+": T2 end."); - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - } - - } - public static void main(String[] args) { - new Thread(new T1()).start(); - new Thread(new T2()).start(); - //T1会延迟2s才end,因为T2:o.notify()后,没有释放o的锁,并且sleep了2s,2s之后T1才得到o的锁,此时T1才能继续执行并end - } - -} diff --git a/MultiThread_demo/src/com/xycode/threadlocal/Client.java b/MultiThread_demo/src/com/xycode/threadlocal/Client.java deleted file mode 100644 index 9f74009..0000000 --- a/MultiThread_demo/src/com/xycode/threadlocal/Client.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.xycode.threadlocal; - -public class Client extends Thread{ - - - public Client(String name) { - super(name); - } - - @Override - public void run() { - System.out.println(getName()+" begin"); - for(int i=0;i<10;++i) { - LogProxy.println("i = "+i); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - LogProxy.close(); - System.out.println(getName()+" end"); - } - - -} diff --git a/MultiThread_demo/src/com/xycode/threadlocal/LogProxy.java b/MultiThread_demo/src/com/xycode/threadlocal/LogProxy.java deleted file mode 100644 index 851aa8b..0000000 --- a/MultiThread_demo/src/com/xycode/threadlocal/LogProxy.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.xycode.threadlocal; -/** - * ThreadLocal模式,为每个线程分配TSLog,并调用 - * @author xycode - * - */ -public class LogProxy { - private static final ThreadLocal tslogCollection=new ThreadLocal<>(); - - private static TSLog getTSLog() { - TSLog tsLog=tslogCollection.get();//会根据当前线程上下文信息来获取数据对象 - if(tsLog==null) {//之前没有分配TSLog的话就分配一个,否则就直接返回结果 - tsLog=new TSLog(Thread.currentThread().getName()+"-log.txt"); - tslogCollection.set(tsLog); - } - return tsLog; - } - - public static void println(String s) { - getTSLog().println(s); - } - - public static void close() { - getTSLog().close(); - } -} diff --git a/MultiThread_demo/src/com/xycode/threadlocal/Main.java b/MultiThread_demo/src/com/xycode/threadlocal/Main.java deleted file mode 100644 index 44efd4d..0000000 --- a/MultiThread_demo/src/com/xycode/threadlocal/Main.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.xycode.threadlocal; - -public class Main { - - public static void main(String[] args) { - //三个Client对应三个线程,也就对于三个TSLog - new Client("Alice").start(); - new Client("Bob").start(); - new Client("Charis").start(); - } - -} diff --git a/MultiThread_demo/src/com/xycode/threadlocal/TSLog.java b/MultiThread_demo/src/com/xycode/threadlocal/TSLog.java deleted file mode 100644 index 9bfe477..0000000 --- a/MultiThread_demo/src/com/xycode/threadlocal/TSLog.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.xycode.threadlocal; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.PrintWriter; - -public class TSLog { - - private PrintWriter writer; - - public TSLog(String filename) { - super(); - try { - this.writer = new PrintWriter(new File(filename)); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - public void println(String s) { - writer.println(s); - } - - public void close() { - writer.println("==== end of log ===="); - writer.close(); - } - -} diff --git a/README.md b/README.md deleted file mode 100644 index 1b8d7ca..0000000 --- a/README.md +++ /dev/null @@ -1,11 +0,0 @@ -## Java-MultiThread-Study - -#### 浠嬬粛: Java 澶氱嚎绋嬪涔 - -#### 鍙傝冧功绫嶏細 - -* 銆奐ava楂樺苟鍙戠▼搴忚璁° - -* 銆婂浘瑙e绾跨▼妯″紡銆 - -* 銆奐ava骞跺彂缂栫▼瀹炴垬銆嬶紝鍦╟om.xycode.pro鍖呬腑 \ No newline at end of file diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100644 index 0000000..32b0426 --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + com.xycode + MultiThreadPro + 1.0-SNAPSHOT + + + + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + + com.xycode.synchronizedDemo.LockPromote.ObjectHeader + + + + + + + + + + + jdk-1.8 + + 1.8 + 1.8 + 1.8 + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e1fab39 --- /dev/null +++ b/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.xycode + MultiThreadPro + 1.0-SNAPSHOT + + + jdk-1.8 + + true + 1.8 + + + + 1.8 + 1.8 + 1.8 + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + + com.xycode.synchronizedDemo.LockPromote.ObjectHeader + + + + + + + + + + + + org.testng + testng + 6.14.3 + + + + + org.openjdk.jol + jol-core + 0.9 + + + + junit + junit + 4.12 + + + + + \ No newline at end of file diff --git a/src/com/xycode/Tests.java b/src/com/xycode/Tests.java new file mode 100644 index 0000000..8bf818b --- /dev/null +++ b/src/com/xycode/Tests.java @@ -0,0 +1,202 @@ +package com.xycode; + +import com.xycode.unsafe.UnsafeUtils; +import org.junit.Test; +import org.testng.Assert; + +import javax.xml.ws.WebEndpoint; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +/** + * ClassName: Test + * + * @Author: xycode + * @Date: 2019/11/9 + * @Description: this is description of the Test class + **/ +public class Tests { + public static class test{ +// int i=j;//static internal class can only access to external class's static variables + //non-static internal class can access to external class's non-static/static variables + byte[] array=new byte[100]; + Tests tests =new Tests(); + } + +// int j=0; + @Test + public void test_1(){ + Map mp1=new ConcurrentHashMap(){ + { + put("1","one"); + put("2","two"); + put("3","three"); + } + }; + Map mp2=new ConcurrentHashMap(){ + { + put("one","1"); + put("two","2"); + put("three","3"); + } + }; + Assert.assertEquals(mp1.get("xxx"),null); + Assert.assertEquals(mp2.get("xxx"),null); + System.out.println(mp1); + System.out.println(mp2); + Assert.assertEquals(mp1.containsKey("1"),true); + Assert.assertEquals(mp2.containsKey("one"),true); + for(String key:mp1.keySet()){ + Assert.assertNotEquals(mp2.remove(mp1.remove(key)),null); + } + Assert.assertEquals(mp1.isEmpty(),true); + Assert.assertEquals(mp2.isEmpty(),true); + + } + + public static String transfer(String s){ + System.out.println("--> transfer..."); + return s.toUpperCase(); + } + + public static String func(){ + try { + System.out.println("try..."); + String result="returnStr"; +// System.out.println(result); + return transfer(result); + }finally { + System.out.println("finally..."); + } + } + + public static void main(String[] args) throws InterruptedException { + +// Semaphore semaphore=new Semaphore(1); +// try { +// semaphore.acquire(); +// semaphore.acquire(); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// }finally { +// semaphore.release(); +// semaphore.release(); +// } +// +// ReentrantLock lock=new ReentrantLock(); +// lock.lock(); +// Condition condition=lock.newCondition(); +// try { +// condition.await(); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// lock.unlock(); + +// //notice: 骞界伒寮曠敤绀轰緥 +// Object o=new Object(); +// ReferenceQueue referenceQueue=new ReferenceQueue<>(); +// PhantomReference phantomReference=new PhantomReference(o,referenceQueue); +// +// System.out.println(o); +// System.out.println(phantomReference); +// System.out.println(phantomReference.get()); +// System.out.println(referenceQueue.poll()); +// +// System.out.println("-------------------------"); +// +// o=null; +// System.gc(); +// System.out.println(o); +// System.out.println(phantomReference); +// System.out.println(phantomReference.get()); +// System.out.println(referenceQueue.poll()); + + + +// Thread t1=new Thread(()->{ +// System.out.println(Thread.currentThread().getName()+": "+Thread.currentThread().getState()); +// LockSupport.park(); +// System.out.println(Thread.currentThread().getName()+": "+Thread.currentThread().getState()); +// }); +// +// System.out.println(t1.getName()+": "+t1.getState()); +// t1.start(); +// TimeUnit.SECONDS.sleep(1); +// System.out.println(t1.getName()+": "+t1.getState()); +// TimeUnit.SECONDS.sleep(1); +// LockSupport.unpark(t1); + + //娴嬭瘯finally +// System.out.println(func()); + +// ExecutorService es=new ThreadPoolExecutor(2, 5, +// 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), new ThreadFactory() { +// private AtomicInteger atomicInteger=new AtomicInteger(0); +// @Override +// public Thread newThread(Runnable r) { +// System.out.println(atomicInteger.incrementAndGet()+": thread created, "); +// return new Thread(r,"thread-"+atomicInteger.get()); +// } +// }); + //notice: 璇佹槑瓒呰繃coreSize鐨勪换鍔′細鍏堣娣诲姞鍒颁换鍔¢槦鍒楅噷闈 + // 鏈缁堢嚎绋嬫睜鐨勫閲: maximumPoolSize + taskQueue.capacity; +// for(int i=0;i<8;++i){ +// es.submit(new Runnable() { +// @Override +// public void run() { +// try { +// TimeUnit.SECONDS.sleep(1); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// System.out.println(Thread.currentThread().getName()+"'s task, "+es.toString()); +// } +// }); +// } +// +// es.shutdown(); +// +// System.out.println("main end"); + + //notice: 鍙嶅皠璋冪敤鏂规硶,瀹為檯涓婁篃鑳藉疄鐜癆OP,浣嗘槸杩欑鏂瑰紡瀵硅皟鐢ㄨ呯殑渚靛叆鎬уお寮, + // 鍗冲繀椤绘彁渚涙柟娉曞悕鍙傛暟(绫讳技杩欐牱,invoke(鏂规硶鍚嶅弬鏁)),鑰屼笉鏄洿鎺.method()鏉ヨ皟鐢 +// A a=new A("xycode"); +// try { +// a.getClass().getMethod("sayName").invoke(a); +// } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { +// e.printStackTrace(); +// } + + Map mp=new HashMap<>(); + mp.put(1,1234); + for(Map.Entry entry:mp.entrySet()){ + System.out.println(entry.getKey()+":"+entry.getValue()); + } + mp.forEach((key,value)->System.out.println(key+":"+value)); + + Thread t=new Thread(); + + } + + static class A{ + String name; + public A(String name) { + this.name = name; + } + public void sayName(){ + System.out.println(this.name); + } + } + + +} diff --git a/src/com/xycode/aqsLock/MyLock.java b/src/com/xycode/aqsLock/MyLock.java new file mode 100644 index 0000000..40e2721 --- /dev/null +++ b/src/com/xycode/aqsLock/MyLock.java @@ -0,0 +1,155 @@ +package com.xycode.aqsLock; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.util.concurrent.*; +import java.util.concurrent.locks.AbstractQueuedSynchronizer; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * ClassName: MyLock + * + * @Author: xycode + * @Date: 2019/10/30 + * @Description: this is description of the MyLock class + **/ +public class MyLock implements Lock { + private MySync sync; + + public MyLock() { + this.sync = new MySync(); + } + + @Override + public void lock() { + sync.acquire(1);//閿佽鏁板姞涓 + } + + @Override + public void lockInterruptibly() throws InterruptedException { + sync.acquireInterruptibly(1); + } + + @Override + public boolean tryLock() { + return sync.tryAcquire(1); + } + + @Override + public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { + return sync.tryAcquireNanos(1,unit.toNanos(time)); + } + + @Override + public void unlock() { + sync.release(1);//閿佽鏁板噺涓 + } + + @Override + public Condition newCondition() { + return sync.newCondition(); + } + + + private static class MySync extends AbstractQueuedSynchronizer { + @Override + protected boolean tryAcquire(int arg) {//arg鏄攣璁℃暟澧為噺 + if(getState()==0){//state==0璇存槑娌℃湁鍏跺畠绾跨▼鍗犵敤閿 + if(compareAndSetState(0,arg)){//CAS鎿嶄綔,灏唖tate璁剧疆涓篴rg + setExclusiveOwnerThread(Thread.currentThread());//璁剧疆涓哄綋鍓嶇嚎绋嬬嫭鍗犺繖涓攣 + return true;//鎴愬姛鑾峰緱閿 + } + }else if(Thread.currentThread()==getExclusiveOwnerThread()){//鍚屼竴涓嚎绋嬪娆ock,鍗抽噸鍏ラ攣 + setState(getState()+1);//褰撳墠绾跨▼鐨勯攣璁℃暟鍔犱竴 + return true; + } + return false;//鑾烽攣澶辫触 + } + + @Override + protected boolean tryRelease(int arg) { + //lock涓巙nlock鏄竴涓瀵瑰簲鐨,鍗冲繀椤绘槸鍚屼竴涓嚎绋嬫墽琛 + if(Thread.currentThread()!=getExclusiveOwnerThread()){ + throw new RuntimeException("unlock error"); + } + int state=getState()-arg; + boolean released=false; + if(state==0){//閿佽鏁颁负0,閲婃斁鎴愬姛 + setExclusiveOwnerThread(null); + released=true; + } + setState(state); + return released; + } + + final ConditionObject newCondition(){ + return new ConditionObject(); + } + } + + + @Test + public void testWithoutMyLock(){ + final int[] cnt={0}; + Thread[] t=new Thread[10]; + final CountDownLatch countDownLatch=new CountDownLatch(t.length); + for(int i=0;i { + for(int i1 = 0; i1 <10000; ++i1){ + ++cnt[0]; + } + countDownLatch.countDown(); + }); + } + for (Thread thread : t) thread.start(); + try { + countDownLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Assert.assertEquals(cnt[0],10*10000); + } + + @Test + public void testWithMyLock(){ + final int[] cnt = {0}; + Thread[] t=new Thread[10]; + final CyclicBarrier cyclicBarrier=new CyclicBarrier(t.length+1); + MyLock lock=new MyLock(); + for(int i=0;i { + try { + lock.lock();//鍙噸鍏ラ攣 + lock.lock(); + for(int i1 = 0; i1 <10000; ++i1){ + ++cnt[0]; + } + }finally { + lock.unlock(); + lock.unlock(); + try { + cyclicBarrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } + } + }); + } + for (Thread thread : t) thread.start(); + try { + cyclicBarrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } + Assert.assertEquals(cnt[0],10*10000); + } + + public static void main(String[] args) { + ReentrantLock lock=new ReentrantLock(); + lock.newCondition(); + } + +} diff --git a/src/com/xycode/countEx/ConditionCount.java b/src/com/xycode/countEx/ConditionCount.java new file mode 100644 index 0000000..d03518d --- /dev/null +++ b/src/com/xycode/countEx/ConditionCount.java @@ -0,0 +1,86 @@ +package com.xycode.countEx; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +/** + * ClassName: ConditionCount + * + * @Author: xycode + * @Date: 2020/3/28 + * @Description: 浣跨敤ReentrantLock + Condition瀹炵幇3涓嚎绋嬩氦鏇胯鏁 + **/ +public class ConditionCount { + private static final int threshold=100; + private AtomicInteger cnt=new AtomicInteger(1); + ReentrantLock lock=new ReentrantLock(); + Condition ab=lock.newCondition(),bc=lock.newCondition(),ca=lock.newCondition(); + public void countA(){ + while(true){ + lock.lock(); + try { + if(cnt.intValue()>threshold) { + ab.signal(); + return; + } + ca.await(); + System.out.println(Thread.currentThread().getId() + ": "+cnt.getAndIncrement()); + ab.signal(); + } catch (InterruptedException e) { + e.printStackTrace(); + }finally { + lock.unlock(); + } + + } + } + + public void countB(){ + while(true){ + lock.lock(); + try { + if(cnt.intValue()>threshold) { + bc.signal(); + return; + } + ab.await(); + System.out.println(Thread.currentThread().getId() + ": "+cnt.getAndIncrement()); + bc.signal(); + } catch (InterruptedException e) { + e.printStackTrace(); + }finally { + lock.unlock(); + } + } + } + + public void countC(){ + while(true){ + lock.lock(); + try { + if(cnt.intValue()>threshold){ + ca.signal(); + return; + } + bc.await(); + System.out.println(Thread.currentThread().getId() + ": "+cnt.getAndIncrement()); + ca.signal(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + public static void main(String[] args) { + ConditionCount syncCount=new ConditionCount(); + new Thread(syncCount::countA).start(); + new Thread(syncCount::countB).start(); + new Thread(syncCount::countC).start(); + + syncCount.lock.lock(); + System.out.println("start..."); + syncCount.ca.signal(); + syncCount.lock.unlock(); + } +} diff --git a/src/com/xycode/countEx/CountDownLatchCount.java b/src/com/xycode/countEx/CountDownLatchCount.java new file mode 100644 index 0000000..85ad3f2 --- /dev/null +++ b/src/com/xycode/countEx/CountDownLatchCount.java @@ -0,0 +1,78 @@ +package com.xycode.countEx; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * ClassName: SyncCount + * + * @Author: xycode + * @Date: 2020/3/28 + * @Description: 浣跨敤CountDownLatch瀹炵幇3涓嚎绋嬩氦鏇胯鏁 + **/ +public class CountDownLatchCount { + private static final int threshold=100; + private AtomicInteger cnt=new AtomicInteger(1); + private CountDownLatch ab=new CountDownLatch(1); + private CountDownLatch bc=new CountDownLatch(1); + private CountDownLatch ca=new CountDownLatch(1); + public void countA(){ + while(true){ + try { + ca.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(cnt.intValue()>threshold) { + ab.countDown(); + return; + } + ca=new CountDownLatch(1); + System.out.println(Thread.currentThread().getId() + ": "+cnt.getAndIncrement()); + ab.countDown(); + } + } + + public void countB(){ + while(true){ + try { + ab.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(cnt.intValue()>threshold) { + bc.countDown(); + return; + } + ab=new CountDownLatch(1); + System.out.println(Thread.currentThread().getId() + ": "+cnt.getAndIncrement()); + bc.countDown(); + } + } + + public void countC(){ + while(true){ + try { + bc.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(cnt.intValue()>threshold){ + ca.countDown(); + return; + } + bc=new CountDownLatch(1); + System.out.println(Thread.currentThread().getId() + ": "+cnt.getAndIncrement()); + ca.countDown(); + } + } + + public static void main(String[] args) { + CountDownLatchCount syncCount=new CountDownLatchCount(); + syncCount.ca.countDown(); + new Thread(syncCount::countA).start(); + new Thread(syncCount::countB).start(); + new Thread(syncCount::countC).start(); + + } +} diff --git a/src/com/xycode/countEx/SynchronizedCount.java b/src/com/xycode/countEx/SynchronizedCount.java new file mode 100644 index 0000000..2589f84 --- /dev/null +++ b/src/com/xycode/countEx/SynchronizedCount.java @@ -0,0 +1,74 @@ +package com.xycode.countEx; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * ClassName: SynchronizedCount + * + * @Author: xycode + * @Date: 2020/3/28 + * @Description: 浣跨敤synchronized + wait/notify瀹炵幇3涓嚎绋嬩氦鏇胯鏁 + **/ +public class SynchronizedCount { + private static final int threshold=123; + private volatile int state=1; + private AtomicInteger cnt=new AtomicInteger(1); + public void countA(){ + while(cnt.intValue() exchanger=new Exchanger<>(); + final CountDownLatch countDownLatch=new CountDownLatch(2); + new Thread(() -> { + Thread thread=Thread.currentThread(); + try { + TimeUnit.SECONDS.sleep(1); + System.out.println("Thread-"+thread.getId()+" arrive exchange point..."); + System.out.println("Thread-"+thread.getId()+" get peer's ID = "+exchanger.exchange(thread.getId()));//浜ゆ崲鐐 + countDownLatch.countDown(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + + new Thread(() -> { + Thread thread=Thread.currentThread(); + try { + TimeUnit.SECONDS.sleep(3);//杩欓噷瑕佹參涓鐐,瀹為檯涓婂彟涓绔嵆浣挎棭鍒拌揪浜ゆ崲鐐,涔熶細闃诲鍦ㄩ偅鍎,鐩村埌杩欐涔熷埌杈句氦鎹㈢偣 + System.out.println("Thread-"+thread.getId()+" arrive exchange point..."); + System.out.println("Thread-"+thread.getId()+" get peer's ID = "+exchanger.exchange(thread.getId()));//浜ゆ崲鐐 + countDownLatch.countDown(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + }).start(); + + try { + countDownLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } +} diff --git a/src/com/xycode/executor/Demo_1.java b/src/com/xycode/executor/Demo_1.java new file mode 100644 index 0000000..823a441 --- /dev/null +++ b/src/com/xycode/executor/Demo_1.java @@ -0,0 +1,50 @@ +package com.xycode.executor; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +/** + * ClassName: Demo_1 + * + * @Author: xycode + * @Date: 2019/11/29 + * @Description: this is description of the Demo_1 class + **/ +public class Demo_1 { + public static void main(String[] args) { + ExecutorService es= Executors.newSingleThreadExecutor(); + es.submit(()->{ + int count=0; + while(true){ + if(count>=2) break; + System.out.println(Thread.currentThread().getName()+" started"); + try { + TimeUnit.SECONDS.sleep(3); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(Thread.currentThread().getName()+" done"); + ++count; + } + + }); + + es.shutdown(); +// try { +// es.awaitTermination(100,TimeUnit.SECONDS); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// es.shutdownNow();//瀵逛簬while(true)鐨勪换鍔,闄ら潪鑷鍋滄,鍚﹀垯鏄仠姝笉浜嗙殑 + while(true){ + System.out.println(es.isTerminated()); + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/com/xycode/executor/MyConnectionPool.java b/src/com/xycode/executor/MyConnectionPool.java new file mode 100644 index 0000000..735d18d --- /dev/null +++ b/src/com/xycode/executor/MyConnectionPool.java @@ -0,0 +1,377 @@ +package com.xycode.executor; + +import java.sql.*; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicIntegerArray; +import java.util.logging.Logger; + +/** + * ClassName: MyExecutorPool + * + * @Author: xycode + * @Date: 2020/2/26 + * @Description: this is description of the MyExecutorPool class + **/ +public class MyConnectionPool { + private static final Logger logger=Logger.getLogger("MyLogger"); + //杩炴帴姹犲ぇ灏 + private final int poolSize; + //瀛樻斁杩炴帴瀵硅薄鐨勫鍣,杩欓噷浣跨敤涓涓暟缁 + private Connection[] connections; + //杩炴帴鐘舵佹暟缁,浣跨敤鍘熷瓙绫诲瀷鐨刟rray,0浠h〃绌洪棽,1浠h〃绻佸繖 + private AtomicIntegerArray states; + + public MyConnectionPool(int poolSize) { + this.poolSize = poolSize; + this.connections = new Connection[poolSize]; + this.states = new AtomicIntegerArray(new int[poolSize]); + + for(int i=0;i{ + Connection connection=pool.getConnection(); + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + pool.releaseConnection(connection); + }).start(); + } + + } + + + static class MockConnection implements Connection{ + private String name; + + public MockConnection(String name) { + this.name = name; + } + + @Override + public String toString() { + return "MockConnection{" + + "name='" + name + '\'' + + '}'; + } + + @Override + public Statement createStatement() throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + return null; + } + + @Override + public String nativeSQL(String sql) throws SQLException { + return null; + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + + } + + @Override + public boolean getAutoCommit() throws SQLException { + return false; + } + + @Override + public void commit() throws SQLException { + + } + + @Override + public void rollback() throws SQLException { + + } + + @Override + public void close() throws SQLException { + + } + + @Override + public boolean isClosed() throws SQLException { + return false; + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + return null; + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + + } + + @Override + public boolean isReadOnly() throws SQLException { + return false; + } + + @Override + public void setCatalog(String catalog) throws SQLException { + + } + + @Override + public String getCatalog() throws SQLException { + return null; + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + + } + + @Override + public int getTransactionIsolation() throws SQLException { + return 0; + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return null; + } + + @Override + public void clearWarnings() throws SQLException { + + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public Map> getTypeMap() throws SQLException { + return null; + } + + @Override + public void setTypeMap(Map> map) throws SQLException { + + } + + @Override + public void setHoldability(int holdability) throws SQLException { + + } + + @Override + public int getHoldability() throws SQLException { + return 0; + } + + @Override + public Savepoint setSavepoint() throws SQLException { + return null; + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + return null; + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + return null; + } + + @Override + public Clob createClob() throws SQLException { + return null; + } + + @Override + public Blob createBlob() throws SQLException { + return null; + } + + @Override + public NClob createNClob() throws SQLException { + return null; + } + + @Override + public SQLXML createSQLXML() throws SQLException { + return null; + } + + @Override + public boolean isValid(int timeout) throws SQLException { + return false; + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + + } + + @Override + public String getClientInfo(String name) throws SQLException { + return null; + } + + @Override + public Properties getClientInfo() throws SQLException { + return null; + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + return null; + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + return null; + } + + @Override + public void setSchema(String schema) throws SQLException { + + } + + @Override + public String getSchema() throws SQLException { + return null; + } + + @Override + public void abort(Executor executor) throws SQLException { + + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + + } + + @Override + public int getNetworkTimeout() throws SQLException { + return 0; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } + } +} diff --git a/src/com/xycode/executor/myThreadPool/MyBlockingQueue.java b/src/com/xycode/executor/myThreadPool/MyBlockingQueue.java new file mode 100644 index 0000000..762f1bb --- /dev/null +++ b/src/com/xycode/executor/myThreadPool/MyBlockingQueue.java @@ -0,0 +1,148 @@ +package com.xycode.executor.myThreadPool; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; +import java.util.logging.Logger; + +/** + * ClassName: MyBlockingQueue + * + * @Author: xycode + * @Date: 2020/2/26 + * @Description: this is description of the MyBlockingQueue class + **/ +public class MyBlockingQueue { + private static final Logger logger=Logger.getLogger("MyLogger"); + private Deque queue; + private int capacity; + + private ReentrantLock lock=new ReentrantLock(); + private Condition notEmpty=lock.newCondition(); + private Condition notFull=lock.newCondition(); + + private MyRejectStrategy rejectStrategy; + + public MyBlockingQueue(int capacity) { + this.capacity = capacity; + queue=new ArrayDeque<>(capacity); + } + + public MyBlockingQueue(Deque queue, MyRejectStrategy rejectStrategy) { + this.queue = queue; + this.rejectStrategy = rejectStrategy; + } + + //甯﹁秴鏃跺弬鏁扮殑鍙栧厓绱 + public T poll(long timeout, TimeUnit timeUnit){ + //鏃堕棿鍗曚綅缁熶竴鎴愮撼绉 + long nanos=timeUnit.toNanos(timeout); + lock.lock(); + try { + while(queue.isEmpty()){ + try { + if(nanos<=0) return null; + System.out.println("queue is empty"); + nanos=notEmpty.awaitNanos(nanos); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + T e=queue.removeFirst(); + notFull.signal(); + return e; + } finally { + lock.unlock(); + } + } + + public T take(){ + lock.lock(); + try { + while(queue.isEmpty()){ + try { + notEmpty.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + //鍙栧嚭鍏冪礌浜,閭h偗瀹氬氨涓嶆弧浜 + T e=queue.removeFirst(); + notFull.signal(); + return e; + } finally { + lock.unlock(); + } + } + + public void put(T element){ + lock.lock(); + try { + while(queue.size()==capacity){//婊$殑 + try { + System.out.println("waiting for add element into queue"); + notFull.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + queue.addLast(element); + //娣诲姞鍏冪礌浜,閭h偗瀹氬氨涓嶄负绌轰簡 + notEmpty.signal(); + } finally { + lock.unlock(); + } + } + + //甯﹁秴鏃跺弬鏁扮殑娣诲姞鍏冪礌 + public boolean offer(T element,long timeout,TimeUnit timeUnit){ + //鏃堕棿鍗曚綅缁熶竴鎴愮撼绉 + long nanos=timeUnit.toNanos(timeout); + lock.lock(); + try { + while(queue.size()==capacity){//婊$殑 + try { + if(nanos<=0) return false; + nanos=notEmpty.awaitNanos(nanos); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + queue.addLast(element); + //娣诲姞鍏冪礌浜,閭h偗瀹氬氨涓嶄负绌轰簡 + notEmpty.signal(); + return true; + } finally { + lock.unlock(); + } + } + + public int size(){ + lock.lock(); + try { + return queue.size(); + } finally { + lock.unlock(); + } + } + + public void putWithReject(MyRejectStrategy rejectStrategy,T element){ + lock.lock(); + try { + if(queue.size()==capacity){//婊$殑 + rejectStrategy.reject(this,element); + }else{ + queue.addLast(element); + //娣诲姞鍏冪礌浜,閭h偗瀹氬氨涓嶄负绌轰簡 + notEmpty.signal(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + lock.unlock(); + } + } + +} diff --git a/src/com/xycode/executor/myThreadPool/MyRejectStrategy.java b/src/com/xycode/executor/myThreadPool/MyRejectStrategy.java new file mode 100644 index 0000000..e91fdf4 --- /dev/null +++ b/src/com/xycode/executor/myThreadPool/MyRejectStrategy.java @@ -0,0 +1,14 @@ +package com.xycode.executor.myThreadPool; + +/** + * InterfaceName: MyRejectStrategy + * + * @Author: xycode + * @Date: 2020/2/26 + * @Description: this is description of the interface + **/ +@FunctionalInterface +public interface MyRejectStrategy { + //鎷掔粷绛栫暐,闇瑕佹嬁鍒颁换鍔¢槦鍒椾笌寰呮坊鍔犵殑浠诲姟 + void reject(MyBlockingQueue queue,T element) throws Exception; +} diff --git a/src/com/xycode/executor/myThreadPool/MyThreadPool.java b/src/com/xycode/executor/myThreadPool/MyThreadPool.java new file mode 100644 index 0000000..d7ee5b5 --- /dev/null +++ b/src/com/xycode/executor/myThreadPool/MyThreadPool.java @@ -0,0 +1,118 @@ +package com.xycode.executor.myThreadPool; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + +/** + * ClassName: MyThreadPool + * + * @Author: xycode + * @Date: 2020/2/26 + * @Description: this is description of the MyThreadPool class + **/ +public class MyThreadPool { + private static final Logger logger=Logger.getLogger("MyLogger"); + //浠诲姟闃熷垪 + private MyBlockingQueue taskQueue; + + //瀛樻斁浠诲姟鎵ц鍗曞厓鐨勫鍣 + private final Set workers=new HashSet<>(); + + //鏍稿績绾跨▼鏁 + private int coreSize; + + //浠诲姟绛夊緟鐨勮秴鏃舵椂闂 + private long timeout; + private TimeUnit timeUnit; + + //鎷掔粷绛栫暐 + private MyRejectStrategy rejectStrategy; + + public MyThreadPool(int coreSize, long timeout, TimeUnit timeUnit,int queueCapacity) { + this.coreSize = coreSize; + this.timeout = timeout; + this.timeUnit = timeUnit; + + this.taskQueue=new MyBlockingQueue<>(queueCapacity); + //榛樿鎷掔粷绛栫暐,姝荤瓑(瀹為檯涓婃病鏈夋嫆缁) + this.rejectStrategy= (queue, element) -> queue.put(element); + } + + public MyThreadPool(int coreSize, long timeout, TimeUnit timeUnit,int queueCapacity,MyRejectStrategy rejectStrategy) { + this.coreSize = coreSize; + this.timeout = timeout; + this.timeUnit = timeUnit; + + this.taskQueue=new MyBlockingQueue<>(queueCapacity); + + this.rejectStrategy=rejectStrategy; + } + + public void execute(Runnable task){ + synchronized (workers){//杩欓噷閽堝workers鐨勬搷浣滈潪绾跨▼瀹夊叏,鎵浠ュ姞涓婂悓姝 + if(workers.size() { + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("-->"+Thread.currentThread().getName()+" execute task"); + }); + } + + } + + + //鎵ц鍗曞厓,涓涓Thread鐨勫皝瑁 + class Worker extends Thread{ + private Runnable task; + + public Worker(Runnable task) { + this.task = task; + } + + @Override + public void run() { + if(task!=null) task.run(); + //鎵ц瀹岃嚜宸辩殑task鍚,鍐嶄粠浠诲姟闃熷垪涓彇task鏉ユ墽琛,浣跨敤take鐨勮瘽,瀹為檯涓婅繖閲屼細涓鐩撮樆濉炰綇 + while ((task=taskQueue.poll(timeout,timeUnit))!=null){ + try { + task.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + synchronized (workers){ + System.out.println("remove worker"); + workers.remove(this); + } + } + } + +} + diff --git a/src/com/xycode/hashMap/TestHashMap7.java b/src/com/xycode/hashMap/TestHashMap7.java new file mode 100644 index 0000000..f9a300a --- /dev/null +++ b/src/com/xycode/hashMap/TestHashMap7.java @@ -0,0 +1,17 @@ +package com.xycode.hashMap; + +import java.util.HashMap; +import java.util.Hashtable; +import java.util.concurrent.ConcurrentHashMap; + +/** + * ClassName: TestHashMap + * + * @Author: xycode + * @Date: 2020/3/1 + * @Description: this is description of the TestHashMap class + **/ +public class TestHashMap7 { + public static void main(String[] args) { + } +} diff --git a/src/com/xycode/observer/BinaryObserver.java b/src/com/xycode/observer/BinaryObserver.java new file mode 100644 index 0000000..9a4ce9d --- /dev/null +++ b/src/com/xycode/observer/BinaryObserver.java @@ -0,0 +1,13 @@ +package com.xycode.observer; + +public class BinaryObserver extends Observer{ + + public BinaryObserver(Subject subject){ + this.subject=subject; + + } + @Override + public void update() { + System.out.println("BinaryObserver : "+Integer.toBinaryString(subject.getState())); + } +} diff --git a/src/com/xycode/observer/Main.java b/src/com/xycode/observer/Main.java new file mode 100644 index 0000000..f75f4a1 --- /dev/null +++ b/src/com/xycode/observer/Main.java @@ -0,0 +1,18 @@ +package com.xycode.observer; + +public class Main { + public static void main(String[] args) { + final Subject subject=new Subject(); + subject.attach(new BinaryObserver(subject)); + + subject.attach(new OctalObserver(subject)); + + subject.setState(100);//BinaryObserver涓嶰ctalObserver浼氱洃鍚埌杩欎釜set,骞舵墦鍗颁俊鎭 + } +} + + + + + + diff --git a/src/com/xycode/observer/Observer.java b/src/com/xycode/observer/Observer.java new file mode 100644 index 0000000..fc23803 --- /dev/null +++ b/src/com/xycode/observer/Observer.java @@ -0,0 +1,7 @@ +package com.xycode.observer; + +public abstract class Observer { + public Subject subject; + public abstract void update(); +} + diff --git a/src/com/xycode/observer/OctalObserver.java b/src/com/xycode/observer/OctalObserver.java new file mode 100644 index 0000000..c5cf239 --- /dev/null +++ b/src/com/xycode/observer/OctalObserver.java @@ -0,0 +1,12 @@ +package com.xycode.observer; + +public class OctalObserver extends Observer { + + public OctalObserver(Subject subject){ + this.subject=subject; + } + @Override + public void update() { + System.out.println("OctalObserver : "+Integer.toOctalString(subject.getState())); + } +} diff --git a/src/com/xycode/observer/Subject.java b/src/com/xycode/observer/Subject.java new file mode 100644 index 0000000..3351f0f --- /dev/null +++ b/src/com/xycode/observer/Subject.java @@ -0,0 +1,29 @@ +package com.xycode.observer; + +import java.util.ArrayList; +import java.util.List; + +public class Subject { + private List observers=new ArrayList<>(); + private int state; + + public void setState(int state) { + if(state==this.state) return; + this.state = state; + notifyAllObserver(); + } + + public int getState() { + return state; + } + + public void attach(Observer observer){ + observers.add(observer); + } + + private void notifyAllObserver(){ + observers.stream().forEach(Observer::update); + //鍑芥暟寮忕紪绋,瀵规瘡涓狾bserver閮芥墽琛寀pdate鏂规硶 + } + +} diff --git a/src/com/xycode/spinlock/MyReentrantSpinLock.java b/src/com/xycode/spinlock/MyReentrantSpinLock.java new file mode 100644 index 0000000..4060c97 --- /dev/null +++ b/src/com/xycode/spinlock/MyReentrantSpinLock.java @@ -0,0 +1,14 @@ +package com.xycode.spinlock; + +import java.util.concurrent.locks.ReentrantLock; + +/** + * ClassName: MyReentrantSpinLock + * + * @Author: xycode + * @Date: 2019/11/7 + * @Description: this is description of the MyReentrantSpinLock class + **/ +public class MyReentrantSpinLock { + +} diff --git a/src/com/xycode/spinlock/MySpinLock.java b/src/com/xycode/spinlock/MySpinLock.java new file mode 100644 index 0000000..e47ab73 --- /dev/null +++ b/src/com/xycode/spinlock/MySpinLock.java @@ -0,0 +1,50 @@ +package com.xycode.spinlock; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +/** + * ClassName: MySpinLock + * + * @Author: xycode + * @Date: 2019/10/28 + **/ +public class MySpinLock { + private AtomicReference atomicReference=new AtomicReference<>(null); + public void lock(){//瀹炵幇鑷棆閿,CPU鍗犵敤杈冮珮 + Thread thread=Thread.currentThread(); + while(!atomicReference.compareAndSet(null,thread)){ +// System.err.println("Thread-"+thread.getId()+" fail to acquire lock"); + thread.yield();//璁╁嚭CPU,鍑忓皯閿佺珵浜,涓嶈繃涓嶄繚璇佷竴瀹氭湁鏁... + } + } + + public void unlock(){ + Thread thread=Thread.currentThread(); + atomicReference.compareAndSet(thread,null); + } + + public static void main(String[] args) { + Thread[] t=new Thread[5]; + MySpinLock spinLock=new MySpinLock(); + for(int i=0;i{ + try { + spinLock.lock(); + System.out.println("Thread-"+Thread.currentThread().getId()+" acquire lock"); + System.out.println("Thread-"+Thread.currentThread().getId()+" working..."); + try { + TimeUnit.SECONDS.sleep(2); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Thread-"+Thread.currentThread().getId()+" release lock"); + System.out.println(); + }finally { + spinLock.unlock(); + } + }); + } + for(Thread thread:t) thread.start(); + } +} diff --git a/src/com/xycode/synchronizedDemo/LockObject.java b/src/com/xycode/synchronizedDemo/LockObject.java new file mode 100644 index 0000000..cc9bc37 --- /dev/null +++ b/src/com/xycode/synchronizedDemo/LockObject.java @@ -0,0 +1,97 @@ +package com.xycode.synchronizedDemo; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; + +public class LockObject { + public static int cnt=0; + public static int cnt2=0; + public static int cnt3=0; + public static int cnt4=0; + //鍦ㄨ繖閲宻ynchronized(this){}涓巗ynchronized淇グ鏂规硶鐨勬晥鏋滄槸涓鏍风殑 + + Object lock=new Object(); + public void inc(){ + try { + TimeUnit.MILLISECONDS.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + synchronized (this){ + ++cnt; + } + } + + public synchronized void inc2(){ + ++cnt2; + } + + //鍦ㄨ繖閲,姣忚皟鐢╥nc3()涓娆,灏变細鏂板缓涓涓狾bject瀹炰緥,瀵规瘮浠ヤ笂涓ょ浣跨敤鏂瑰紡,杩欑鏂瑰紡鐨勯攣绮掑害鏇寸粏 + //浣嗘槸,杩欑鍔犻攣鏂瑰紡鏄笉瀹夊叏鐨,鍥犱负鏂规硶鍐呯殑Object瀹炰緥鍙害鏉熷埌浜嗗綋鍓嶈皟鐢ㄧ嚎绋, + //褰撴湁澶氫釜绾跨▼鍚屾椂璋冪敤鏃,绾跨▼褰兼涔嬮棿璧蜂笉鍒颁簰鏂ヤ綔鐢! +// public void inc3(){ +// Object o=new Object(); +// synchronized (o){ +// ++cnt3; +// } +// } + + //涓婇潰鐨刬nc3()鏀规垚杩欐牱灏辩嚎绋嬪畨鍏ㄤ簡,鍥犱负lock鏄疞ockObject鐨勬垚鍛樺彉閲,鍜宼his鏄竴涓瀵瑰簲鐨, + // 鏁堟灉涔熷拰synchronized(this){}涓鏍 + public void inc3(){ + synchronized (lock){ + ++cnt3; + } + } + + //涓嬮潰杩欎釜瀹為檯涓婂拰synchronized(class){]鏁堟灉涓鏍蜂簡,閿佺殑闄愬埗鏇村己浜,浼氱害鏉熷叏浣揕ockObject瀹炰緥 + //璇︾粏鐨勯獙璇佽LockStatic.java + private static Object staticLock=new Object(); + public void inc4(){ + synchronized (staticLock){ + ++cnt4; + } + } + + public static void main(String[] args) { + Thread[] t=new Thread[200]; + //鍥犱负鍙湁涓涓狶ockObject瀹炰緥,鎵浠ynchronized璧峰埌浜嗗悓姝ョ殑浣滅敤 + LockObject lockObject=new LockObject(); + for(int i=0;i header=new ArrayList<>(); + while(matcher.find()){ + header.add(matcher.group()); + } + //灏忕鏈哄櫒,闇瑕佸弽杩囨潵閬嶅巻 + StringBuilder sb=new StringBuilder(); + if(order.equals(ByteOrder.LITTLE_ENDIAN)){ + Collections.reverse(header); + } + for(String s:header){ + sb.append(s).append(" "); + } + return sb.toString().trim(); + } + + /** + * 閽堝64bit jvm鐨勮В鏋愬璞″ご鍑芥暟 + * 鍦64bit jvm涓,瀵硅薄澶存湁涓や釜閮ㄥ垎: Mark Word鍜孋lass Pointer, Mark Word鍗8瀛楄妭,Class Pointer鍓囩湅鍏蜂綋鎯呭喌4瀛楄妭鎴8瀛楄妭 + * Class Pointer鍗4瀛楄妭(64bit JVM寮鍚帇缂╂寚閽堥夐」(榛樿鏄紑鍚殑),涓嶅紑鍚殑璇濆氨鏄8涓瓧鑺) + * @param s 瀵硅薄澶寸殑浜岃繘鍒跺舰寮忓瓧绗︿覆(姣8浣,浣跨敤涓涓┖鏍煎垎寮) + */ + public static void parseObjectHeader(String s){ + String[] tmp=s.split(" "); + System.out.print("Class Pointer: "); + for(int i=0;i<4;++i){ + System.out.print(tmp[i]+" "); + } + System.out.println("\nMark Word:"); + if(tmp[11].charAt(5)=='0'&&tmp[11].substring(6).equals("01")){//0 01鏃犻攣鐘舵,涓嶈冭檻GC鏍囪鐨勬儏鍐 + //notice: 鏃犻攣鎯呭喌涓媘ark word鐨勭粨鏋: unused(25bit) + hashcode(31bit) + unused(1bit) + age(4bit) + biased_lock_flag(1bit) + lock_type(2bit) + // hashcode鍙渶瑕31bit鐨勫師鍥犳槸: hashcode鍙兘澶т簬绛変簬0,鐪佸幓浜嗚礋鏁拌寖鍥,鎵浠ヤ娇鐢31bit灏卞彲浠ュ瓨鍌 + System.out.print("\thashcode (31bit): "); + System.out.print(tmp[7].substring(1)+" "); + for(int i=8;i<11;++i) System.out.print(tmp[i]+" "); + System.out.println(); + }else if(tmp[11].charAt(5)=='1'&&tmp[11].substring(6).equals("01")){//1 01,鍗冲亸鍚戦攣鐨勬儏鍐 + //notice: 瀵硅薄澶勪簬鍋忓悜閿佺殑鎯呭喌,鍏剁粨鏋勪负: ThreadID(54bit) + epoch(2bit) + unused(1bit) + age(4bit) + biased_lock_flag(1bit) + lock_type(2bit) + // 杩欓噷鐨凾hreadID鏄寔鏈夊亸鍚戦攣鐨勭嚎绋婭D, epoch: 涓涓亸鍚戦攣鐨勬椂闂存埑,鐢ㄤ簬鍋忓悜閿佺殑浼樺寲 + System.out.print("\tThreadID(54bit): "); + for(int i=4;i<10;++i) System.out.print(tmp[i]+" "); + System.out.println(tmp[10].substring(0,6)); + System.out.println("\tepoch: "+tmp[10].substring(6)); + }else{//杞婚噺绾ч攣鎴栭噸閲忕骇閿佺殑鎯呭喌,涓嶈冭檻GC鏍囪鐨勬儏鍐 + //notice: JavaThread*(62bit,include zero padding) + lock_type(2bit) + // 姝ゆ椂JavaThread*鎸囧悜鐨勬槸 鏍堜腑閿佽褰/閲嶉噺绾ч攣鐨刴onitor + System.out.print("\tjavaThread*(62bit,include zero padding): "); + for(int i=4;i<11;++i) System.out.print(tmp[i]+" "); + System.out.println(tmp[11].substring(0,6)); + System.out.println("\tLockFlag (2bit): "+tmp[11].substring(6)); + System.out.println(); + return; + } + System.out.println("\tage (4bit): "+tmp[11].substring(1,5)); + System.out.println("\tbiasedLockFlag (1bit): "+tmp[11].charAt(5)); + System.out.println("\tLockFlag (2bit): "+tmp[11].substring(6)); + + System.out.println(); + } + + + @Test + public void testBiasedLock(){ + //闇瑕佺姝㈠亸鍚戦攣寤惰繜: -XX:BiasedLockingStartupDelay=0 + Obj o=new Obj(); + parseObjectHeader(getObjectHeader(o)); + synchronized (o){ + parseObjectHeader(getObjectHeader(o)); + } + } + + @Test + public void testLightLock(){ + //闇瑕佺姝㈠亸鍚戦攣寤惰繜: -XX:BiasedLockingStartupDelay=0 + Obj o=new Obj(); + parseObjectHeader(getObjectHeader(o)); + synchronized (o){ + parseObjectHeader(getObjectHeader(o)); + } + //鍗囩骇涓鸿交閲忕骇閿,鍥犱负涓嬮潰鐨勭嚎绋嬪張鍗犵敤浜唎,娉ㄦ剰鏄笂闈㈠厛鎵ц瀹屽悗,鎵嶅紑鍚笅闈㈣繖涓嚎绋,鍥犳涓嶄細鍗囩骇涓洪噸閲忕骇閿 + new Thread(()->{ + synchronized (o){ + parseObjectHeader(getObjectHeader(o)); + } + }).start(); + } + + @Test + public void testHeavyLock(){ + //杩欓噷娌℃湁绂佹鍋忓悜閿佸欢杩,鎵浠ユ渶鍒濇槸鏃犻攣鐘舵 + Obj o=new Obj(); + parseObjectHeader(getObjectHeader(o)); + synchronized (o){ + parseObjectHeader(getObjectHeader(o)); + } + //閲嶉噺绾ч攣 + for(int i=0;i<2;++i)//绾跨▼鏁板ぇ浜1鏃(浜ら敊鎵ц),浼氬崌绾ф垚閲嶉噺绾ч攣 + new Thread(()->{ + synchronized (o){ + parseObjectHeader(getObjectHeader(o)); + } + }).start(); + } + + public static void main(String[] args) { + /** + * Mark Word 鍗 8 瀛楄妭 + * Class Pointer 鍗 4 瀛楄妭 + * + * 鍋忓悜閿佹爣蹇椾綅(1bit,1琛ㄧず鏈夊亸鍚戦攣)+閿佺姸鎬佷綅(2bit) + * (1)01: 鍋忓悜閿 + * (0)01: 鏃犻攣 + * + * 00: 杞婚噺绾ч攣 + * 10: 閲嶉噺绾ч攣 + * + * 11: GC鏍囪,杩欑鎯呭喌涓,鍋忓悜閿佹爣蹇椾綅蹇呭畾涓0 + */ + Obj o=new Obj(); +// 娴嬭瘯synchronized閿佸崌绾х殑鎯呭喌,鑻ヨ绔嬪嵆鏌ョ湅娴嬭瘯鎯呭喌,闇瑕佺姝㈠亸鍚戦攣寤惰繜: -XX:BiasedLockingStartupDelay=0 +// 寮鍚亸鍚戦攣: -XX:+UseBiasedLocking=0, jdk6寮濮嬪氨榛樿寮鍚簡,涓嶅紑鍚殑璇濆氨鏄厛浣跨敤杞婚噺绾ч攣 +// System.out.println(o.hashCode());//notice: 璋冪敤hashcode鍚庡氨娌℃湁鍋忓悜閿佷簡...(鍥犱负bit浣嶇疆琚崰浜) + + //main绾跨▼,鍋忓悜閿 + synchronized (o){ + parseObjectHeader(getObjectHeader(o)); + } + //杞婚噺绾ч攣,鍥犱负涓嬮潰鐨勭嚎绋嬪張鍗犵敤浜唎 + new Thread(()->{ + synchronized (o){ + parseObjectHeader(getObjectHeader(o)); + } + }).start(); + + //閲嶉噺绾ч攣 +// for(int i=0;i<2;++i)//绾跨▼鏁板ぇ浜1鏃(浜ら敊鎵ц),浼氬崌绾ф垚閲嶉噺绾ч攣 +// new Thread(()->{ +// synchronized (o){ +// parseObjectHeader(getObjectHeader(o)); +// } +// }).start(); + + + //娴嬭瘯hashcode,骞朵笖浼氬鑷翠笉鑳藉亸鍚戦攣 +// parseObjectHeader(getObjectHeader(o)); +// System.out.println(o.hashCode()); +// System.gc();//浼氬鍔犱竴娆″垎浠e勾榫,杩炵画璋冪敤濂藉儚鍙兘璧蜂竴娆℃晥鏋 +// parseObjectHeader(getObjectHeader(o)); + + } +} diff --git a/src/com/xycode/synchronizedDemo/LockStatic.java b/src/com/xycode/synchronizedDemo/LockStatic.java new file mode 100644 index 0000000..1952121 --- /dev/null +++ b/src/com/xycode/synchronizedDemo/LockStatic.java @@ -0,0 +1,78 @@ +package com.xycode.synchronizedDemo; + +public class LockStatic { + public static int cnt=0; + public static int cnt2=0; + public static int cnt3=0; + + private static Object staticLock=new Object(); + public void inc(){ + synchronized (staticLock){ + ++cnt; + } + } + + public synchronized static void inc2(){ + ++cnt2; + } + + public static void inc3(){ + synchronized (LockStatic.class){ + ++cnt3; + } + } + + public static void main(String[] args) { + Thread[] t=new Thread[1000]; + //鍥犱负鍙湁涓涓狶ockObject瀹炰緥,鎵浠ynchronized璧峰埌浜嗗悓姝ョ殑浣滅敤 + LockStatic lockStatic=new LockStatic(); + LockStatic lockStatic2=new LockStatic(); + + LockObject lockObject=new LockObject(); + LockObject lockObject2=new LockObject(); + for(int i=0;i myAtomicInteger.increment(5)).start(); + new Thread(()-> myAtomicInteger.decrement(5)).start(); + } + try { + TimeUnit.SECONDS.sleep(3); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + //鑻ョ嚎绋嬪畨鍏ㄧ殑璇濆簲璇ヤ細杈撳嚭100 + System.out.println(myAtomicInteger.getValue());// -> 100 + } +} diff --git a/src/com/xycode/unsafe/TestUnsafe.java b/src/com/xycode/unsafe/TestUnsafe.java new file mode 100644 index 0000000..d447ad4 --- /dev/null +++ b/src/com/xycode/unsafe/TestUnsafe.java @@ -0,0 +1,52 @@ +package com.xycode.unsafe; + +import sun.misc.Unsafe; + +import java.lang.reflect.Field; + +/** + * ClassName: TestUnsafe + * + * @Author: xycode + * @Date: 2020/2/25 + * @Description: this is description of the TestUnsafe class + **/ +public class TestUnsafe { + public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { + //閫氳繃鍙嶅皠鏂瑰紡鑾峰彇Unsafe鐨則heUnsafe鍩 + Field unsafeField= Unsafe.class.getDeclaredField("theUnsafe"); + System.out.println(unsafeField); + + //theUnsafe鏄痯rivate鐨,鎵浠ヨ繖閲岄渶瑕佽缃闂潈闄 + unsafeField.setAccessible(true); + + //鏍规嵁theUnsafe鑾峰緱Unsafe瀵硅薄,娉ㄦ剰杩欓噷杩欓噷鐨則heUnsafe鏄痵tatic鐨,鎵浠ョ敤get(null) + Unsafe unsafe= (Unsafe) unsafeField.get(null); + + //浣跨敤Unsafe鐨凜AS鎿嶄綔 + Student student=new Student(); + //鑾峰彇id,name鍦ㄥ璞′腑鐨勫亸绉婚噺,浠ヤ究鍚庣画CAS浣跨敤 + long idOffset=unsafe.objectFieldOffset(Student.class.getDeclaredField("id")); + long nameOffset=unsafe.objectFieldOffset(Student.class.getDeclaredField("name")); + unsafe.compareAndSwapInt(student,idOffset,0,1234); + unsafe.compareAndSwapObject(student,nameOffset,null,"寰愬博"); + + //娴嬭瘯鐪嬫槸鍚﹁祴鍊兼垚鍔 + System.out.println(student); + } + + + static class Student{ + volatile int id; + volatile String name; + + @Override + public String toString() { + return "Student{" + + "id=" + id + + ", name=" + name + + '}'; + } + } + +} diff --git a/src/com/xycode/unsafe/UnsafeUtils.java b/src/com/xycode/unsafe/UnsafeUtils.java new file mode 100644 index 0000000..1eed990 --- /dev/null +++ b/src/com/xycode/unsafe/UnsafeUtils.java @@ -0,0 +1,33 @@ +package com.xycode.unsafe; + +import sun.misc.Unsafe; + +import java.lang.reflect.Field; + +/** + * ClassName: UnsafeUtils + * + * @Author: xycode + * @Date: 2020/2/25 + * @Description: this is description of the UnsafeUtils class + **/ +public class UnsafeUtils { + private static final Unsafe unsafe; + static{ + //閫氳繃鍙嶅皠鏂瑰紡鑾峰彇Unsafe鐨則heUnsafe鍩 + try { + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + //theUnsafe鏄痯rivate鐨,鎵浠ヨ繖閲岄渶瑕佽缃闂潈闄 + unsafeField.setAccessible(true); + + //鏍规嵁theUnsafe鑾峰緱Unsafe瀵硅薄,娉ㄦ剰杩欓噷杩欓噷鐨則heUnsafe鏄痵tatic鐨,鎵浠ョ敤get(null) + unsafe= (Unsafe) unsafeField.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static Unsafe getUnsafe(){ + return unsafe; + } +}