張小二求職記の単例モード(三)の決戦マルチスレッド
9602 ワード
M:前回言ったマルチスレッドの単例モードは?
z;わかる
M:一つ書きましょう package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<30;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
一部の結果は以下の通りであり,異なるインスタンスが現れたことが分かった.
.Singleton@75da931b
.Singleton@34780af5
.Singleton@34780af5
.Singleton@157ee3e5
.Singleton@157ee3e5
.Singleton@34780af5
.Singleton@2b1be57f
.Singleton@157ee3e5
.Singleton@2b1be57f
.Singleton@60f00e0f
.Singleton@157ee3e5
synchronizedに参加した結果は以下の通りです.すべてが唯一です.自分でやってみてください.
例構造関数の単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b一例モード.Singleton@78214f6b、
M:synchronizedを使ったんですね。静的な方法を修飾するのは、何に鍵をかけるのかに相当します。
ああ、sinletonに相当する。classロック
M:いいですね。マルチスレッドはプログラムの同時性を高め、プログラムの実行効率を高めることができますが、マルチスレッド自体、特に同期はロックの競争を引き起こします。ロックの競争を減らし、本方法を改造し、他の例を挙げますか。
z:得られた粒度とロックの範囲を減少させる.たとえば、データベースにテーブル・ページの行をロックすると、粒度が低くなり、ロックの競合が減少します.
例えば読み書きロックでは,1つのロックしかないとSSも反発し,ロックを読み書きロックに分割することで競合を減らす.
キューのロック解除では、ヘッダにロックを設定し、しっぽにロックを設定することで、ロックの粒度を小さくすることはできません.
パラレルhashmap、
M:ほほほ、よく知っています。コードを書いて、この問題を分析してください。
z:instance=!=nullはロックをかけなくてもいいです.
だから以下のように改造します.
package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<30;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
M:二重ロック検査、どうして二重ロックするの?
ステップ1:同期ブロックに入るのは空のみです.インスタンスがあれば結果を直接返します.
第2部:空と判断:スレッドの不確実性に従って、2つのスレッドが同時に判断する
if(instance=null)は同期が速く、出現のために2つのインスタンスを作成します.package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
instance=new Singleton();
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<100;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
結果の重複
例構造関数単例構造関数単例モードSingleton@46993aaa単例モードSingleton@52e5376a単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例構造関数単例モードSingleton@157ee3e5単例モードSingleton@46993aaa単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5シングルM:
単例モードは一段落して、次はNIOになります。NIOにはいわゆる観察者モードがあります。はっきり言って、イベント駆動です。NIOはnew ioと呼ばれ、no-blockingとも呼ばれ、非ブロック、Net ioとも呼ばれ、ネットワークプラスioとも呼ばれ、従来のsocketプログラミングを改善するとともに、IO関数を改善し、IOとネットワークプログラミングに重点を置き、ついでに観察者モードを解決し、帰りましょう
z:
package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<30;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
一部の結果は以下の通りであり,異なるインスタンスが現れたことが分かった.
.Singleton@75da931b
.Singleton@34780af5
.Singleton@34780af5
.Singleton@157ee3e5
.Singleton@157ee3e5
.Singleton@34780af5
.Singleton@2b1be57f
.Singleton@157ee3e5
.Singleton@2b1be57f
.Singleton@60f00e0f
.Singleton@157ee3e5
synchronizedに参加した結果は以下の通りです.すべてが唯一です.自分でやってみてください.
例構造関数の単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b一例モード.Singleton@78214f6b、
M:synchronizedを使ったんですね。静的な方法を修飾するのは、何に鍵をかけるのかに相当します。
ああ、sinletonに相当する。classロック
M:いいですね。マルチスレッドはプログラムの同時性を高め、プログラムの実行効率を高めることができますが、マルチスレッド自体、特に同期はロックの競争を引き起こします。ロックの競争を減らし、本方法を改造し、他の例を挙げますか。
z:得られた粒度とロックの範囲を減少させる.たとえば、データベースにテーブル・ページの行をロックすると、粒度が低くなり、ロックの競合が減少します.
例えば読み書きロックでは,1つのロックしかないとSSも反発し,ロックを読み書きロックに分割することで競合を減らす.
キューのロック解除では、ヘッダにロックを設定し、しっぽにロックを設定することで、ロックの粒度を小さくすることはできません.
パラレルhashmap、
M:ほほほ、よく知っています。コードを書いて、この問題を分析してください。
z:instance=!=nullはロックをかけなくてもいいです.
だから以下のように改造します.
package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<30;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
M:二重ロック検査、どうして二重ロックするの?
ステップ1:同期ブロックに入るのは空のみです.インスタンスがあれば結果を直接返します.
第2部:空と判断:スレッドの不確実性に従って、2つのスレッドが同時に判断する
if(instance=null)は同期が速く、出現のために2つのインスタンスを作成します.package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
instance=new Singleton();
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<100;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
結果の重複
例構造関数単例構造関数単例モードSingleton@46993aaa単例モードSingleton@52e5376a単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例構造関数単例モードSingleton@157ee3e5単例モードSingleton@46993aaa単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5シングルM:
単例モードは一段落して、次はNIOになります。NIOにはいわゆる観察者モードがあります。はっきり言って、イベント駆動です。NIOはnew ioと呼ばれ、no-blockingとも呼ばれ、非ブロック、Net ioとも呼ばれ、ネットワークプラスioとも呼ばれ、従来のsocketプログラミングを改善するとともに、IO関数を改善し、IOとネットワークプログラミングに重点を置き、ついでに観察者モードを解決し、帰りましょう
z:
z:得られた粒度とロックの範囲を減少させる.たとえば、データベースにテーブル・ページの行をロックすると、粒度が低くなり、ロックの競合が減少します.
例えば読み書きロックでは,1つのロックしかないとSSも反発し,ロックを読み書きロックに分割することで競合を減らす.
キューのロック解除では、ヘッダにロックを設定し、しっぽにロックを設定することで、ロックの粒度を小さくすることはできません.
パラレルhashmap、
M:ほほほ、よく知っています。コードを書いて、この問題を分析してください。
z:instance=!=nullはロックをかけなくてもいいです.
だから以下のように改造します.
package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<30;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
M:二重ロック検査、どうして二重ロックするの?
ステップ1:同期ブロックに入るのは空のみです.インスタンスがあれば結果を直接返します.
第2部:空と判断:スレッドの不確実性に従って、2つのスレッドが同時に判断する
if(instance=null)は同期が速く、出現のために2つのインスタンスを作成します.package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
instance=new Singleton();
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<100;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
結果の重複
例構造関数単例構造関数単例モードSingleton@46993aaa単例モードSingleton@52e5376a単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例構造関数単例モードSingleton@157ee3e5単例モードSingleton@46993aaa単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5シングルM:
単例モードは一段落して、次はNIOになります。NIOにはいわゆる観察者モードがあります。はっきり言って、イベント駆動です。NIOはnew ioと呼ばれ、no-blockingとも呼ばれ、非ブロック、Net ioとも呼ばれ、ネットワークプラスioとも呼ばれ、従来のsocketプログラミングを改善するとともに、IO関数を改善し、IOとネットワークプログラミングに重点を置き、ついでに観察者モードを解決し、帰りましょう
z:
package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<30;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
ステップ1:同期ブロックに入るのは空のみです.インスタンスがあれば結果を直接返します.
第2部:空と判断:スレッドの不確実性に従って、2つのスレッドが同時に判断する
if(instance=null)は同期が速く、出現のために2つのインスタンスを作成します.
package ;
public class Singleton {
private static Singleton instance=null;
private Singleton()
{
System.out.println(" ");
}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
instance=new Singleton();
}
}
return instance;
}
public static void main(String[] args) {
// 50 , getinstance
for(int i=0;i<100;i++)
{
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Singleton.getInstance());
}
}).start();
}
}
}
結果の重複
例構造関数単例構造関数単例モードSingleton@46993aaa単例モードSingleton@52e5376a単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例構造関数単例モードSingleton@157ee3e5単例モードSingleton@46993aaa単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5シングルM: